OpenCV2:初中篇 图像平滑技术-图像采样

一.简介

图像变换上的采样就是将图像分辨率改变的过程

采样分为上采样和下采样,上采样是指将图像分辨率扩大,下采样是指将图像分辨率缩小

二.最近邻插值

最近邻插值是最简单的图像缩放处理方法,其原理是提取源数据图像中与其邻域最近像素值来作为目标图像相对应点的像素值

 

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

// 实现最近邻插值图像缩放
cv::Mat Interpolation(cv::Mat srcImage)
{
    // 判断输入有效性
    CV_Assert(srcImage.data != NULL);
    int rows = srcImage.rows;
    int cols = srcImage.cols;

    // 构建目标图像
    cv::Mat dstImage = cv::Mat(cv::Size(150, 150), srcImage.type(), cv::Scalar::all(0));
    int dstRows = dstImage.rows;
    int dstCols = dstImage.cols;

    // 坐标转换,求取缩放倍数
    float cx = (float)cols / dstCols;
    float ry = (float)rows / dstRows;
    std::cout << "cv: " << cx << "ry:" << ry <<std::endl;

    // 遍历图像,完成缩放操作
    for (int i = 0; i < dstCols; i++)
    {

        // 取整,获取目标图像在源图像对应坐标
        int ix = cvFloor(i * cx);
        for (int j = 0; j < dstRows; j++)
        {
            int jy = cvFloor(j * ry);

            // 边界处理,防止指针越界
            if (ix > cols - 1)
                ix = cols -1;
            if (jy > rows - 1)
                jy = rows - 1;

            // 映射矩阵
            dstImage.at<cv::Vec3b>(j, i) = srcImage.at<cv::Vec3b>(jy, ix);
        }
    }

    return dstImage;
}


int main()
{

    // 图像源读取及验证
    cv::Mat srcImage = cv::imread("a.jpg");
    if (!srcImage.data)
        return -1;

    // 最近邻插值缩放操作
    cv::Mat dstImage = Interpolation(srcImage);
    cv::imshow("srcImage", srcImage);
    cv::imshow("dstImage", dstImage);
    cv::waitKey(0);

    return 0;
}

三.双线性插值

双线性插值处理是应用最广泛的图像缩放方法之一,其稳定性高且时间复杂度较优

四.插值操作性能对比

五.图像金字塔

 图像金字塔是一系列图像的集合,所有多个分辨率的图像来源于同一原始图像,常用于图像缩放或图像分割中.

图像金字塔结构(Pyramid)适用于多分辨率处理的一种图像存储数据结构,向下采样技术的是高斯金字塔,向上重建技术的是拉普拉斯金字塔

1.高斯金字塔

高斯金字塔的生成过程包含高斯核卷积和下采样过程,

2.拉普拉斯金字塔

拉普拉斯金字塔操作实现是向上重建图像

3.实现

OpenCV提供了 pyrUp() 和 pyrDown() 函数用于向上和向下采样

原文地址:https://www.cnblogs.com/k5bg/p/11195327.html