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

Posted 小白图像与视觉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);



}



以上是关于c++ 与opencv 学习笔记五-图像插值01的主要内容,如果未能解决你的问题,请参考以下文章

C++下opencv学习笔记(图像的简单读取丶显示与存储)

初学opencv c++学习笔记图像的相关操作及属性

[opencv学习笔记] jiazhigang 30讲源码C++版本(含Makefile)

OpenCV学习笔记——多种Smooth平滑处理

[转]opencv3 图像处理 之 图像缩放( python与c++实现 )

openCV 图像的基本操作 学习回顾记录