最近邻插值法
定义:将变换后的图像各像素点的灰度值设置为源图像中与其最邻近像素的灰度值的方法。
则:
// 相应的缩放比例
float fw = float W / w;
float fh = float H / h;
// 则目标图像中(X, Y)的坐标对应着源图像中的(x, y)点
// 在此会对所求的像素进行四舍五入
Y = (int)W / w * y;
X = (int)H / h * x;
特点:
- 最基本、最简单的图像缩放算法;
- 效果最差,放大后会产生严重的马赛克,缩小后的图像会产生严重的失真(根本原因:在计算时对浮点数进行了四舍五入)
代码实现:
//-----------------------------
// Description: 最近邻线性插值
//-----------------------------
void NearestInsert(const Mat &srcImage, Mat &dstImage, int width, int height)
{
// 缩放比例
double dRows = (double)srcImage.rows / height; // 行缩放
double dCols = (double)srcImage.cols / width; // 列缩放
int channel = srcImage.channels(); // 通道数
int nRows = 0, nCols = 0;
// 近邻内插法
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
for (int k = 0; k < channel; k++)
{
nRows = cvRound(i * dRows);
nCols = cvRound(j * dCols);
if (nRows < srcImage.rows && nRows >= 0
&& nCols < srcImage.cols && nCols >= 0)
{
dstImage.at<Vec3b>(i, j)[k] = srcImage.at<Vec3b>(nRows, nCols)[k];
}
}
}
}
}
运行结果:
整个资源下载:https://download.csdn.net/download/y363703390/10277764
【参考:】