vlambda博客
学习文章列表

c++ 与opencv 学习笔记五-图像插值01

This browser does not support music or audio playback. Please play it in Weixin or another browser.

1.图像插值算法

  1. 最近邻插值

    定义:目标各像素点的灰度值-->源图像中与其最邻近像素的灰度值。

最近临插值算法优点是算法简单,易于实现,但是缺点是由于相邻像素点的像素值相同,容易出现色块现象。

Sx=srcWidth/dstWidth     ;
Sy=srcHeight/dstHeight  ;              
srcX=dstX* Sx ,
srcY = dstY *  Sy

#include<iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;


String src_windowName = "src";
String dst_windowName = "nearest_dst";



//**************************************************
//    @brief   : none
//    @author  :yanyong
//    @input   :src
//    @output  :dst
//    @date    : none
/*
sx,sy 缩放银子
sx = src.width/dst.width
sy = src.height/dst.heigh
*/
//**************************************************
void nearest(cv::Mat& src, cv::Mat& dst, double sx, double sy)
{    
    //由缩放因子计算输出图像的尺寸(四舍五入)
    int dst_cols = round(src.cols / sx);
    int dst_rows = round(src.rows / sy);
    //创建输出图像
    dst = cv::Mat(dst_rows, dst_cols, src.type());
    //灰度图像处理
    if (src.channels() == 1
    {
        cout << "sucess" << endl;

        for (int y = 0; y < dst.rows; y++) 
        {
            for (int x = 0; x < dst.cols; x++) 
            {
                //插值计算 最近邻四舍五入
                int y_index = round(y * sy);
                int x_index = round(x * sx);
                if (y_index > src.rows - 1) y_index = src.rows - 1;//防止越界
                if (x_index > src.cols - 1) x_index = src.cols - 1;//防止越界
                dst.at<uchar>(y, x) = src.at<uchar>(y_index, x_index);

            }
        }
    }
    else 
    {
        cout << "sucess_rgb" << endl;
        for (int y = 0; y < dst.rows; y++)
        {
            for (int x = 0; x < dst.cols; x++)
            {
                //插值计算 最近邻四舍五入
                int y_index = round(y * sy);
                int x_index = round(x * sx);
                if (y_index > src.rows - 1) y_index = src.rows - 1;//防止越界
                if (x_index > src.cols - 1) x_index = src.cols - 1;//防止越界
                //B
                dst.at<cv::Vec3b>(y, x)[0] = src.at<cv::Vec3b>(y_index, x_index)[0];
                //G
                dst.at<cv::Vec3b>(y, x)[1] = src.at<cv::Vec3b>(y_index, x_index)[1];
                //R
                dst.at<cv::Vec3b>(y, x)[2] = src.at<cv::Vec3b>(y_index, x_index)[2];
            }
        }
    }
}


int main()
{
    Mat src, dst;
    double sx = 2, sy = 2;
    //加载图像
    src = imread("D:\\VS2017\\vs_code\\仿射变换warpAffine\\1.jpg");

    namedWindow(src_windowName, WINDOW_AUTOSIZE);
    imshow(src_windowName, src);
    nearest(src, dst, sx, sy);
    namedWindow(dst_windowName, WINDOW_AUTOSIZE);
    imshow(dst_windowName, dst);

    cv::waitKey(0);



}