基于visual c++的图像处理的基本操作.docx

上传人:b****5 文档编号:6061872 上传时间:2023-01-03 格式:DOCX 页数:44 大小:1.16MB
下载 相关 举报
基于visual c++的图像处理的基本操作.docx_第1页
第1页 / 共44页
基于visual c++的图像处理的基本操作.docx_第2页
第2页 / 共44页
基于visual c++的图像处理的基本操作.docx_第3页
第3页 / 共44页
基于visual c++的图像处理的基本操作.docx_第4页
第4页 / 共44页
基于visual c++的图像处理的基本操作.docx_第5页
第5页 / 共44页
点击查看更多>>
下载资源
资源描述

基于visual c++的图像处理的基本操作.docx

《基于visual c++的图像处理的基本操作.docx》由会员分享,可在线阅读,更多相关《基于visual c++的图像处理的基本操作.docx(44页珍藏版)》请在冰豆网上搜索。

基于visual c++的图像处理的基本操作.docx

基于visualc++的图像处理的基本操作

 

 

基于VS2005的图像处理

 

学号:

************

学生所在学院:

信息工程学院

学生姓名:

黄继昆

任课教师:

********

教师所在学院:

信息工程学院

 

2012年5月

摘要:

VC是一种快速高效的可视化开发语言,在图形绘制和图像处理上功能较强。

本文介绍了基于VS2005的VC图像处理,主要包括,实现对一副位图的灰度变换,二值化,缩放,任意角度的旋转,刚兴趣区域的提取与保存,为图像添加噪声和用多种方法去除噪声,最后讲到了常见的图像格式之间的转换,以及打开图像文件夹下的任意格式的图像进行浏览,幻灯片播放和定时自动播放。

关键词:

灰度变换二值变换缩放旋转区域提取去噪常见格式转换自动播放幻灯片播放

 

引言

数字图像处理(DigitalImageProcessing),就是利用数字计算机或则其他数字硬件,对从图像信息转换而得到的电信号进行某些数学运算,以提高图像的实用性。

例如从卫星图片中提取目标物的特征参数,三维立体断层图像的重建等。

总的来说,数字图像处理包括点运算、几何处理、图像增强、图像复原、图像形态学处理、图像编码、图像重建、模式识别等。

目前数字图像处理的应用越来越广泛,已经渗透到工业、医疗保健、航空航天、军事等各个领域,在国民经济中发挥越来越大的作用。

VisualStudio2005提供了高度安全性、可靠性、快速性的编译优化方法,完全编译出原始机器码而非中间码,软件执行速度大大提高。

在编译和连接过程中,VisualStudio2005自动忽略未被修改的原代码和没有使用的函数,从而大大提高了编译和连接速度。

VisualStudio2005的CPU透视工具包括五个独立的小面板,可以对正在运行程序从内部进行深层次的了解。

另外VisualStudio2005还提供了一个专业开发环境所必需的命令行工具,以帮助建立C++程序或者准备编译和连接的程序进行更精细的控制。

以VS2005为开发平台,利用VC进行图像处理,既方便又快捷。

VC当中为我们提供了一个封装好的类MFC。

我们通过利用MFC当中封装好的类进行图像处理可以达到既方便又快捷。

 

 

1.图像调节

1.1灰度变换

1.1.1彩色图像转换为灰度图像

图像的灰度变换处理时图像增强处理技术中一种非常基础,直接的空间域图像处理方法,也是图像数字化软件和图像显示软件的一个重要组成部分。

灰度变换是指根据某种目标条件按一定变换关系逐点改变原图像中每个像素灰度值的方法。

目的是为了改善画质,使图像的显示效果更加清晰。

颜色可以为黑白色,灰度色和彩色。

工程应用中经常要用到把彩色图像变换为灰度图像,采集卡过来的图像为彩色图像,为加快处理速度,要把彩色图转化为黑白图像。

一般情况下彩色图像每个像素用三个分量,每个分量对应着R、G、B,转换后的黑白图像的每个像素用一个分量表示该点的灰度值,取值在0~255,255表示白色,0表示黑色,其余取值根据其在0~255之间的分布,取得相应的颜色。

RGB图像转化为灰度的图像方法很多,主要有:

1,最大值法;

2,平均值法;

3,加权平均值法。

本文所讲的灰度变换是利用加权平均值法,公式如下:

(1.1)

其中

为转化后黑白图像在

点处的灰度值。

灰化处理的思想:

使图像RGB三个通道的值都等于Gray(i,j)。

一实现步骤:

(1)首先打开vs2005软件创建一个单文档应用程序,取名为Image;

(2)打开一幅位图;

(3)定义一个全局变量unsignedchar*m_pDib,并为其开辟足够大的空间,将打开的图像的数据区保存到该指针所指向的内存。

本文后续对图像的所有处理都是对该内从当中的数据进行处理。

(3)使图像RGB三个通道的值都等于Gray(i,j);

(4)得到变换后的图像并显示。

在程序中的操作如下:

运行程序出现如下图所示的单文档对话框后单击文件—打开—打开Bmp格式,就可以打开一张Bmp格式的彩色图像并进行处理。

本文所说的处理图像的格式都是Bmp格式。

所以在处理图像之前要选择打开一张Bmp格式的图片。

图1-1打开一幅图像

二处理结果

图1.2原始图片

图1.3灰度化后的图片

1.1.2二值化处理

一副图像包括目标物体,背景及噪声,怎样从多值的数字图像中只读取出目标物体,最常用的就是阈值处理。

阈值化(thresholding)可以看作是削波的一个特例,我们用图1.1说明阈值化的原理。

图1.4 阈值化的原理

不难看出,只要令削波中的g1old=g2old就实现了阈值化。

阈值就象个门槛,比它大就是白,比它小就是黑。

经过阈值化处理后的图象变成了黑白二值图,所以说阈值化是灰度图转二值图的一种常用方法。

进行阈值化只需给出阈值点g1old即可。

阈值化变换函数表达式如下:

(2.1)

本程序中设定阈值为128,即取0与255的平均值,即为二值化处理。

一实现步骤

(1)读取图像文件

(2)利用图像的数据区指针,利用加权平均值求得像素的灰度值

(3)将每个像素的灰度值与127比较

(4)将比较得到的值返回给红、绿、蓝三个分量

(5)得到变换后的图像并显示

二流程图

三软件处理结果

 

图1.5灰度化并二值化后的图片

1.2对比度调节

对比度指的是一幅图像中明暗区域最亮的白和最暗的黑之间不同亮度层级的测量,即指一幅图像灰度反差的大小。

所以我们调节对比度的时候只需要增大原来像素之间的层级即可,即我们得到每个像素的值,然后对每个像素点的RGB值根据我们需要增加的数值进行增加减少即可。

一实验步骤

(1)打开一幅图像;

(2)点击对比度调节,输入对比度调节的数值;

(3)确定之后即显示出处理过之后的图像。

二核心算法

为了保证我们的软件可以对一副图像进行连续的处理,我们这个地方处理数据的起始地址依然是我们之前灰度处理时,存放数据的内存的首地址,后续的处理都是一样。

for(i=0;i

for(j=0;j<3*width;j=j+3)

{

intb=*(pImgData+i*lineByte+j);

intg=*(pImgData+i*lineByte+j+1);

intr=*(pImgData+i*lineByte+j+2);

if(b>=128)

b+=ChangeVale;

else

b-=ChangeVale;

if(g>=128)

g+=ChangeVale;

else

g-=ChangeVale;

if(r>=128)

r+=ChangeVale;

else

r-=ChangeVale;

if(b>=255)

*(pImgData+i*lineByte+j)=255;

else

if(b<=0)

*(pImgData+i*lineByte+j)=0;

else

*(pImgData+i*lineByte+j)=b;

if(g>=255)

*(pImgData+i*lineByte+j+1)=255;

else

if(g<=0)

*(pImgData+i*lineByte+j+1)=0;

else

*(pImgData+i*lineByte+j+1)=g;

if(r>=255)

*(pImgData+i*lineByte+j+2)=255;

else

if(r<=0)

*(pImgData+i*lineByte+j+2)=0;

else

*(pImgData+i*lineByte+j+2)=r;

三实验过程图

1原始图像如图1-1所示

2输入需要增加的对比度值

图1.6输入需要增加的对比度值

3结果效果图

图1.7在图1-6所输入数值下的效果图

1.3图像的亮度调节

我们知道在显示屏上使图像变量或者变暗,是根据人眼对亮度的敏感度进行调节的,根据人眼的视觉效应,根据白色对人的眼睛的视觉效应是最亮,黑色对人眼的视觉效应最暗,所以我们对一幅图像进行亮度处理的时候,只需要对原像素点RGB值增加或者减少我们想要改变的数值即可,当然我们必须保证我们的像素点的RGB值在我们进行改变之后,满足在0~255之内。

一实验步骤

1打开一幅图像;

2点击菜单栏当中的图像调节->亮度调节,在弹出的对话框当中输入我们需要改变的数值;

3点击确定即可得到效果图

二核心算法

for(i=0;i

for(j=0;j<3*width;j=j+3)

{

intb=*(pImgData+i*lineByte+j)+ChangeVale;

intg=*(pImgData+i*lineByte+j+1)+ChangeVale;

intr=*(pImgData+i*lineByte+j+2)+ChangeVale;

if(b>=255)

*(pImgData+i*lineByte+j)=255;

else

if(b<=0)

*(pImgData+i*lineByte+j)=0;

else

*(pImgData+i*lineByte+j)=b;

if(g>=255)

*(pImgData+i*lineByte+j+1)=255;

else

if(g<=0)

*(pImgData+i*lineByte+j+1)=0;

else

*(pImgData+i*lineByte+j+1)=g;

if(r>=255)

*(pImgData+i*lineByte+j+2)=255;

else

if(r<=0)

*(pImgData+i*lineByte+j+2)=0;

else

*(pImgData+i*lineByte+j+2)=r;

三实验过程图

1,原始图像如图1-1所示;

2,输入需要改变的亮度值

图1-8选择改变的亮度值

3,实验结果

图1-9亮度增加图1-8所示的数值后结果图

2.图像的几何变换

2.1图像的缩放

实现图像缩放的算法原理:

假设图像X轴方向缩放比例是

,Y轴方向缩放比例是,那么原图中点(x0,y0)对应新图中的(x1,y1)为:

本主要使用两种算法实现图像的缩放:

双线性差值;最邻近差值。

1双线性差值

(1)当

>1且

>1时,原图像被放大。

=

=2时,图像放大2倍,原图中的某一个像素,对应新图中的4个像素。

如下图1-1所示。

(a)原图中的某个像素(b)对应新图的4个像素

图3.1图像放大示意图

(2)当

<1且

<1时,原图像被缩小。

例如,当

=

=0.5时,图像被缩到一半大小,原图中4个像素对应新图中1个像素。

此时缩小后的图像中的(0,0)像素对应于原图中的(0,0)(0,1)(1,0)(1,1)像素,以此类推。

在原图基础上,每行隔一个像素取一点,每隔一行进行操作。

如图1-2所示。

(a)原图中的某4个像素(b)对应新图的1个像素

图3.2图像缩小示意图

由此可见,放大与缩小的原理有些差异。

在实验中,缩放用的基本方法为双线性插值法。

双线性插值的英文名称是BilinearInterpolation,广泛应用在信号处理,图像处理和视频处理等应用中,双线性插值又称为双线性内插。

在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。

双线性插值,又称为双线性内插。

在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。

假如我们想得到未知函数f在点p=(x,y)的值,假设我们已知函数f在Q11=(x1,y1),Q12=(x1,y2),Q21=(x2,y1)以及Q22=(x2,y2)四个点的值。

首先在x方向进行线性插值,得到R1和R2,然后在y方向进行线性插值,得到P。

这样就得到所要的结果f(x,y)。

其中点Q11,Q12,Q21,Q22为已知的4个像素点。

第一步:

X方向的线性插值第二步:

做完X方向的插值后再做Y方向的点R1和R2插值。

2最临近插值

最临近插值的的思想很简单。

对于通过反向变换得到的的一个浮点坐标,对其进行简单的取整,得到一个整数型坐标,这个整数型坐标对应的像素值就是目的像素的像素值,也就是说,取浮点坐标最邻近的左上角点(对于DIB是右上角,因为它的扫描行是逆序存储的)对应的像素值。

可见,最邻近插值简单且直观,但得到的图像质量不高。

不过我试验的结果是,用肉眼看不出它比双线性效果的差别。

一实验步骤

(1)读取图像文件;

(2)设置图像要放大或者缩小的倍数;

(3)进入缩放程序;

(4)得到变换后的图像并显示。

二流程图

三实验过程图

1打开一幅图像如图1-1所示

2点击菜单栏的几何变换->图像缩放,选择插值方式

图2-1输入缩放参数

3点击确定可以看到效果图

图2-3缩放后效果图

 

2.2图像的旋转

图像的旋转是以图像的中心为原点,旋转一定的角度。

旋转后图像的大小一般会发生改变。

图像的旋转既可以把转出显示区域的图像截去,也可以扩大图像范围以显示所有的图像。

如图4.1所示,点(x0,y0)经过旋转

度后坐标变成(x1,y1)。

图2-4图像旋转示意图

在旋转前:

(4-1)

旋转后:

(4-2)

上图旋转是绕坐标轴原点(0,0)进行的,向右为X轴正方向,向上为Y轴正方向,设其为坐标系II,而屏幕中的坐标一般以左上角为原点,以向右为X轴正方向、向下为Y轴正方向,设其为坐标系I。

如果是绕一个指定点(a,b)旋转,则要先将坐标系平移到该点,再进行旋转,然后平移回新的坐标原点。

下面是坐标系平移转换公式的推导。

如图4.2所示,将坐标系I平移到坐标系II处,其中坐标系II的原点在坐标系I中的坐标为(a,b)。

图2-5旋转中心平移示意图

设图像的宽度为w,高度为h,得到

(4-3)

其逆变换矩阵表达式为:

(4-4)

按如下方法即可旋转图像:

(1)根据公式4-3,将坐标系I变到坐标系II;

(2)根据公式4-2,将该点顺时针旋转

角;

(3)根据公式4-4,将坐标系II变到坐标系I。

假设图像在新的坐标系下,以旋转后新图像左上角为原点,未旋转时中心坐标为(a,b),旋转后中心坐标为(c,d),则旋转变换矩阵表达式为:

因此

(4-5)

逆变换为:

(4-6)

这样,对于新图中的每一点,可以根据式4-6求出对应原图中的点,得到它的灰度,如果超出原图范围,则置成白色。

设图像原始宽度为wide原始高度为height,旋转后应首先计算出公式中需要的几个参数。

如图1-4所示,原始图像4个角的坐标分别为:

旋转后图像4个角的坐标分别为:

按照旋转公式,在旋转后的新图中,这4个点的坐标为:

则新图像的宽度newwide和高度newheight为:

由图4-4可知,原图的中心坐标(a,b)在显示屏幕上的位置为:

旋转后图像的中心坐标(c,d)在显示屏幕上的位置为:

根据式1-6,设中间变量t1,t2,令:

所以

一实验步骤

1,打开一幅图像;

(1)将角度化为弧度

(2)获得原始图像的宽度和高度以及原图的三个点的坐标,经过旋转后得到新图三个点的坐标。

(3)计算新图的宽度和高度,最后在原图范围内对像素点进行变换。

运行程序,在弹出的对话框中填入要旋转的角度,点击确定,就可得到旋转后的图像。

2,点击菜单栏当中的几何变换->图像旋转->任意角度、左转90、右转90;

4,点击确定查看实验结果。

三核心代码

for(x=0;x

{

//计算该像素在源图像中的坐标

inty0=(long)(-((float)x)*fSina+((float)y)

*fCosa+f2+0.5);

intx0=(long)(((float)x)*fCosa+((float)y)

*fSina+f1+0.5);

//判断是否在源图范围内

/*if((x0>=0)&&(x0

(y0>=0)&&(y0

{

//用双线性插值

if(!

Type)

{

unsignedchar*pTemp=Interpolation(nOldWidth,nOldHeight,

(float)x0,(float)y0,

lineByte,pImgData);

//复制像素

memcpy(pNewBits+(nNewHeight-y-1)*nNewWidthBytes+x*3,pTemp,3);

delete[]pTemp;

}

else

{

//指向源图像第y0行,第x0个像素

//注意此处宽度和高度应该互换

/*pOldTemp=pImgData;*/

/*pOldTemp+=(nOldHeight-1-y0)*lineByte;;*/

/*pOldTemp+=x0*nMovedBits;*/

//复制像素

memcpy(pNewBits+y*nNewWidthBytes+x*3,pImgData+y0*lineByte+x0*3,3);

}

}

/*pNewTemp+=nMovedBits;*/

}

该部分取点的时候同样用到了双线性插值法和最邻近插值法,前面已经讲过在此不再赘述。

四实验过程图

1,打开图像如图1-1所示

2,点击菜单栏当中的几何变换->图像旋转->任意角度、左转90、右转90;

图2-6输入参数

3,效果图

图2-7旋转30度之后的效果图

图2-8左转90度效果图

图2-9右转90度效果图

3图像噪声的添加与去噪

3.1对图像进行加噪声

3.1.1加入高斯噪声

所谓高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。

一个高斯随机变量z的PDF可表示为:

P(z)=

其中z代表灰度,u是z的均值,

是z的标准差。

高斯噪声的灰度值多集中在均值附近。

(高斯函数)

加入高斯噪声步骤:

(1)打开一幅图像;

(2)创建一个高斯函数,根据输入的均值和方差产生随机的高斯数;

(3)将步骤

(2)产生的高斯数加到数据区。

(4)显示。

3.1.2加入椒盐噪声

1.椒盐噪声实现步骤

(1)取得图像大小、数据区,并把数据区复制到缓冲区中;

(2)循环取得各点像素值;

(3)若产生的随机数小于特定值128,把该点置0,大于128该点置255;

(4)把缓冲区中改动的数据复制到原数据区中,刷新显示。

2.主要程序代码

3.仿真实现

(1)原图像如图1-1所示;

(2)菜单上点击添加噪声

图3-1设置添加噪声参数

选择相应的参数点击确定

图3-2均值方差都为20的高斯噪声

图3-3黑点白点数各为100的椒盐噪声

3.2对图像进行去噪

平均滤波往往不只是把干扰去除,还常把图像的边缘模糊,因而造成视觉上的失真,如果目的只要把干扰去除,而不是刻意让图像模糊,则中值滤波是比较好的选择。

中值滤波是一种非线性的信号处理方法,与其对应的中值滤波器也是一种非线性的滤波器。

它在一定的条件下,可以克服线性滤波器如最小均方滤波、平均值滤波等所带来的图像细节模糊,而且对滤波脉冲干扰及图像扫描噪声最为有效。

特别适合用在有很强的胡椒粉式或脉冲式的干扰时,因为这些干扰值与其邻近像素的灰度值有很大的差异,因此经排序后取中值的结果是强迫将此干扰变成与其邻近的某些像素的灰度值一样,达到去除干扰的效果。

此次试验主要使用了均值滤波,中值滤波,线性平滑滤波(也属于均值滤波范畴),为了有更明显的效果,点击相应的菜单会弹出相应的对话框,我们可以设置相应的滤波窗的大小(大于等于三的奇数)。

去噪结果

图3-4输入虑窗参数

图3-5均值滤波去除随机噪声

图3-6均值滤波去除椒盐噪声

图3-7局部平均化去除随机噪声

图3-9中值滤波去除高斯噪声

图3-10中值滤波去除椒盐噪声

结论:

由此可见,使用中值滤波去除椒盐噪声比去除随机噪声更为有效,得到的效果更好。

中值滤波比较适合去除椒盐噪声。

4.对图像进行感兴趣部分的提取并保存

4.1显示感兴趣区域

这部分主要功能是对图像当中自己感兴趣的区域进行显示,这部分的主要实现过程如下:

(1)在菜单栏添加图像特征提取菜单,并将其popup属性设置为false,这样就可以直接为其添加命令相应了。

在实现部分代码满足当点击该菜单的时候可以开始图像区域提取,然后再次点击取消该功能;

(2)在view类中添加左键,右键和mousemove命令响应,实现按住鼠标左键随着鼠标的移动画出一个矩形。

同时找到感兴趣区域的位置。

(3)松开鼠标左键的同时,弹出对话框,然后选择操作,是显示亦或者保存。

图4-1按下鼠标左键划出感兴趣的区域自动显示后续操作对话框

(4)提取感兴趣区域的算法思想是,根据步骤

(2)所选择的区域,在原图当中找到该感兴趣区域在原图当中对应的位置,然后将这部分拷贝到原数据区,然后覆盖到原来的数据区。

然后刷新显示。

图4-2显示所选择的感兴趣区域

4.2保存所选择的感兴趣区域

该部分是在显示感兴趣区域的基础上做的,这部分的操作是在图4-1当中选择保存显示区域,然后点击确定,现在我们可以显示保存对话框。

图4-3保存选择的感兴趣区域

这部分的点击保存之后,将自己选择的感兴趣区域在原图像中那部分图像重新保存到一个新的内存区。

然后调用保存函数,将这部分保存为bmp文件。

5.图像浏览及格式转换

我们知道,VisualC++的CBitmap类和静态图片控件的功能是比较弱的,它只能显示出在资源中的图标、位图、光标以及图元文件的内容,而不像VB中的Image控件可以显示出绝大多数的外部图像文件(BMP、GIF、JPEG等)。

因此,想要在对话框或其他窗口中显示外部图像文件则只能借助于第三方提供的控件或代码。

现在,MFC和ATL共享的新类CImage为图像处理提供了许多相应的方法,这使得VisualC++在图像方面的缺憾一去不复返了。

CImage类概述:

CImage

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 中医中药

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1