您的位置:首页 > 编程语言 > C语言/C++

利用数组操作实现灰度图像放大两倍(C++&opencv)

2014-11-03 19:45 585 查看
      在这篇博文中,我们要做的事情是利用数组元素操作来实现将一张图片放大两倍,我们使用图像内插方法中的近邻内插法来为扩大后的空闲元素赋值,比如这样的一个图像二维矩阵:

  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;
}

使用最邻近内插法得到的图像放大效果并不好,对新位置的灰度值进行的“预测”,我们可以使用更好的近似方法:
双线性内插,双三次内插等等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息