c++ 与opencv 学习笔记五-图像插值01
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);
}