在这篇博文中,我们要做的事情是利用数组元素操作来实现将一张图片放大两倍,我们使用图像内插方法中的近邻内插法来为扩大后的空闲元素赋值,比如这样的一个图像二维矩阵:
1 2 3 1 @ 2 @ 3 @
4 5 6 ========》 @ @ @ @ @ @ (扩大后的样子,@相当于填充符,@需要用最近
7 8 9 4 @ 5 @ 6 @ 的元素值来填充)
@ @ @ @ @ @
7 @ 8 @ 9 @
图像的读入和图像数据的提取工作在我的上一篇博文《利用数组操作实现灰度图像的上下左右翻转(C++&opencv)》中已经给出了解决的方法,现在我们假设图像已经读入内存中,data[][]二维数组已经存储了
图像的灰度值。
(最近邻内插法:把源图像中最近邻的灰度赋给每个新位置,这就是最近邻内插法)。
接下来是程序:
int Image::Zoom()
{
//声明一个新的图像空间
IplImage *img_zoom = cvCreateImage(cvSize(width*2, height*2), IPL_DEPTH_8U, 1);
unsigned char *imgz = (unsigned char *)img_zoom->imageData;
int count = 0;
for (int i = 0; i < height*2; ++i)
{
for (int j = 0; j < width*2; ++j)
{
//对i j 进行除二操作既实现了
//将数组对应位置的数据赋值到相应位置
//同时还将新位置的数据赋成了最近邻位置的数据
imgz[count++] = data[i/2][j/2];
}
}
cvNamedWindow("Img_Zoom", CV_WINDOW_AUTOSIZE);
cvShowImage("Img_Zoom", img_zoom);
cvWaitKey(0);
cvDestroyWindow("Img_Zoom");//if not destroy will come out runtime error
// pure virtual function call
cvReleaseImage(&img_zoom);
return 0;
}
使用最邻近内插法得到的图像放大效果并不好,对新位置的灰度值进行的“预测”,我们可以使用更好的近似方法:
双线性内插,双三次内插等等。