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

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

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

使用最邻近内插法得到的图像放大效果并不好,对新位置的灰度值进行的“预测”,我们可以使用更好的近似方法:

双线性内插,双三次内插等等。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值