OpenCV2:初中篇 圖像平滑技術-圖像採樣

一.簡介

圖像變換上的採樣就是將圖像分辨率改變的過程ios

採樣分爲上採樣和下采樣,上採樣是指將圖像分辨率擴大,下采樣是指將圖像分辨率縮小數據結構

 

二.最近鄰插值

最近鄰插值是最簡單的圖像縮放處理方法,其原理是提取源數據圖像中與其鄰域最近像素值來做爲目標圖像相對應點的像素值函數

 

#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;
}

 

 

三.雙線性插值

雙線性插值處理是應用最普遍的圖像縮放方法之一,其穩定性高且時間複雜度較優性能

 

 

四.插值操做性能對比

 

五.圖像金字塔

 圖像金字塔是一系列圖像的集合,全部多個分辨率的圖像來源於同一原始圖像,經常使用於圖像縮放或圖像分割中.ui

圖像金字塔結構(Pyramid)適用於多分辨率處理的一種圖像存儲數據結構,向下採樣技術的是高斯金字塔,向上重建技術的是拉普拉斯金字塔spa

 

1.高斯金字塔

高斯金字塔的生成過程包含高斯核卷積和下采樣過程,指針

 

2.拉普拉斯金字塔

拉普拉斯金字塔操做實現是向上重建圖像code

 

3.實現

OpenCV提供了 pyrUp() 和 pyrDown() 函數用於向上和向下採樣blog

相關文章
相關標籤/搜索