图像缩放之最近邻插值

来源:互联网 发布:对妹妹做过什么 知乎 编辑:程序博客网 时间:2024/05/21 01:32

坚持就是胜利之第一个脚印。感谢指正,让我学习到新的知识。


数学原理

假设源图像A的大小为m*n,缩放后的图像B的大小为M*N,那么有:

pixel_B(X,Y)=pixel_A(X*(m/M),Y*(n/N))

也就是说缩放后的图像B的(X,Y)位置处的像素值为源图像A的(X*(m/M),Y*(n/N))处的像素值。

优缺点

优点:我觉得原理很容易理解,操作起来很容易。
缺点:还不知道,留着后面学了新的方法做对比。

代码实现

/************************2016-10-5******************************************功能:最近邻插值缩放图像*数学原理; 假设原图像大小为m*n,新图像的大小为M*N 那么新图像的(X,Y)点的像素pixel(X,Y)=原图像pixel(X*(m/M),Y*(N/n)) 由于图像坐标不能为小数,对计算出的坐标通过四舍五入或取整处理**********************************************************************/#include <opencv2\opencv.hpp>#include <iostream>using namespace std;using namespace cv;int main(){    Mat image = imread("lena.jpg");    int Col_s = image.cols / 2;//新的图像长宽缩小至一半    int Row_s = image.rows / 2;    Mat smallerImage(Row_s, Col_s, CV_8UC3);    for (int i = 0; i < Row_s; i++){        for (int j = 0; j < Col_s; j++){            int X = i*2;            int Y = j*2;                    smallerImage.at<Vec3b>(i, j) = image.at<Vec3b>(X, Y);        }    }    int Col_b = image.cols * 2;//新的图像长宽增加一倍    int Row_b = image.rows * 2;    Mat biggerImage(Row_b, Col_b, CV_8UC3);    for (int i = 0; i < Row_b; i++){        for (int j = 0; j < Col_b; j++){            int X = i / 2;            int Y = j / 2;            biggerImage.at<Vec3b>(i, j) = image.at<Vec3b>(X, Y);        }    }    imshow("image", image);    imshow("smallerImage", smallerImage);    imshow("biggerImage", biggerImage);    waitKey(0);    return 0;}

程序效果图

源图片

行列各缩小一半后的效果图

行列各增大一倍后的效果图

1 0
原创粉丝点击