利用数组操作实现灰度图像放大两倍(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;
}
使用最邻近内插法得到的图像放大效果并不好,对新位置的灰度值进行的“预测”,我们可以使用更好的近似方法:
双线性内插,双三次内插等等。
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;
}
使用最邻近内插法得到的图像放大效果并不好,对新位置的灰度值进行的“预测”,我们可以使用更好的近似方法:
双线性内插,双三次内插等等。
相关文章推荐
- 利用数组操作实现灰度图像的上下左右翻转(C++&opencv)
- 图像卷积操作的手动实现(基于opencv的C++编译环境)
- 利用opencv2和c++实现视频与图像的互相转换
- 利用OpenCV和C++实现由RGB图像转化为灰度图,再将灰度图转化为二值图的程序
- 利用opencv实现图像滑动窗口操作
- 利用最大熵进行阈值分割从而实现灰度图像的二值化的原理概要及OpenCV代码
- 关于OpenCV中利用函数cvConvert实现图像数据类型转换(8U->16S)
- C++ OpenCV 实现RGB彩色图像转化成灰度图像再转换成二值图像
- 利用数组实现队列操作
- 灰度图像的膨胀操作(vc实现)
- Qt&OpenCV——Q图像处理基本操作
- Qt可显示基本的图像类型,利用QImage、QPxmap类可以实现图像的显示,并且利用类中的方法可以实现图像的基本操作(缩放、旋转)。
- C++实现数组的排序/插入重新排序/以及逆置操作
- 用OpenCV实现Photoshop曲线功能的'在图像中取样设置黑场'
- Python & OpenCV 图像基本操作
- 灰度图像二值化-----c++实现
- C语言数组实现栈的基本操作,并利用O(1)求出栈中最小元素
- C++实现数组的排序/插入重新排序/以及逆置操作
- 我的OpenCV学习笔记(三):利用操作像素完成简单的图像处理:加入椒盐噪声、图像翻转、改变对比度、图像锐化
- YV12 转换为 灰度图像 ,利用opencv进行二次开发