图像处理课程设计.docx
《图像处理课程设计.docx》由会员分享,可在线阅读,更多相关《图像处理课程设计.docx(23页珍藏版)》请在冰豆网上搜索。
图像处理课程设计
《数字图像处理》课程设计报告
基于MFC的数字图像处理系统设计
指导教师
学生姓名
学生学号
(部)专业班
2014年7月1日
1.目的与要求
将实验1至实验8所设计的数字图像处理的算法和功能添加到同一个MFC程序中(可以是基于对话框
的程序,或者基于单/多文档的程序),形成一个基于MFC勺图像处理系统,可以增加一些课本上没有讲到的效果,如风格化等,开发的结果是类似PS的一款软件。
要求:
用户可设置具体参数,可以通过该平台展现不同参数下的实验效果。
2.主要技术和原理
2.1彩色转换
彩色图像转换为8位灰度图像,利用cvCreatelmage创建图像函数
语法:
Ipllmage*cvCreatelmage(CvSizesize,intdepth,intchannels)
参数:
size:
图像的宽、高。
depth:
图像图元深度。
channels每个图元的颜色通道数。
返回值:
IplImage结构体。
cvCvtColor色彩空间转换函数
语法:
voidcvCvtColor(constCvArr*src,CvArr*dst,intcode)
参数:
src为源图像的不定数组,CvArr*指针,一般情况为IplImage型指针。
Dst:
目的地址的CvArr指针,一般为IplImage型结构体。
Code色彩转换空间,
常数定义为CV_2
2.2几何变换
1)翻转
翻转分为水平翻转和垂直翻转。
cvFlip垂直,水平或既垂直又水平地翻转二维数组
语法:
voidcvFlip(constCvArr*src,CvArr*dst=NULL,intflip_mode=0)
参数:
src输入数组
dst输出数组,若dst=NULL,则翻转是在内部替换。
flip_mode指定怎样翻转数组。
若=0,则绕x轴翻转;若>0,则绕y轴翻转;若<0,则绕x轴和y轴翻转。
说明:
函数cvFlip以下面三种方式之一翻转数组(行和列下标是以0为基点的):
ifflip_mode=0,则dst(i,j)=src(rows(src)-i-1,j),绕x轴旋转
ifflip_mode>0,则dst(i,j)=src(i,cols(src1)-j-1),绕y轴旋转
ifflip_mode<0,则dst(i,j)=src(rows(src)-i-1,cols(src)-j-1),绕x轴和y轴旋转
2)旋转
在旋转函数Rotate中通过angle大小控制旋转角度。
cvMat初始化矩阵函数
语法:
CvMatcvMat(introws,intcols,inttype,void*data=NULL)
参数:
rows矩阵行数,cols矩阵列数,type元素类型,data可选项,指向分配给矩阵头的数据指针。
OpenCV中重要的矩阵变换函数,使用方法为cvMat*cvCreateMat(introws,intcols,inttype);这里type可以是任何预定义类型,预定义类型的结构如下:
CV_(S|U|F)C。
于是,矩阵的元素可以是32位浮点型数据(CV_32FC1),或者是无符号的8位三元组的整型数据(CV_8UC3)或者是无数的其他类型的元素。
cvGetQuadrangleSubPix使用子像素精度提取像素四边形。
该函数通过指定的变换矩阵对原图像进行相应的变换。
语法:
voidcvGetQuadrangleSubPix(constCvArr*src,CvArr*dst,constCvMat
*map_matrix)
参数:
src输入图像
dst提取的四边形
map_matrix为2*3的变换矩阵[A|b]
说明:
止此函数以子像素精度从图像src中提取四边形,并将结果存储于dst,计算公式如下:
dst[x+width(dst)/2,y+height(dst)/2]=src(A11xA2yA21xA22yb2)
其中,A和b为几何形变参数,均来自映射矩阵map_matrix。
映射矩阵为:
此处,非整数坐标A・(x,y)Tb的像素点值通过双线性插值得到。
多通道图像的每一个通道都单独计算。
这个函数旋转图像后,超出原图像部分,默认的是重复边界模式。
3)放大与缩小
首先定义一个缩放倍数,对图像尺寸变换后利用cvCreatelmage创建目的图像,利用
cvResize图像大小变换函数。
功能:
函数cvResize将图像src改变尺寸得到与dst同样大小。
若设定ROI,函数将按常规支持ROI.
语法:
voidcvResize(constCvArr*src,CvArr*dst,intinterpolation=
CV_INTER_LINEAR);
参数:
src输入图像
dst输出图像
interpolation插值方法,包括:
(1)CV_INTER_NN-最近邻插值
(2)CV_INTER_LINEAR-双线性插值
(3)CV_INTER_AREA使用像素关系重采样。
当图像缩小时,该方法可以避免波纹出现。
当图像放大时,类似于CV_INTER_NN方法。
(4)CV_INTER_CUBIC-立方插值
2.3图像增强
1)直方图均衡化
cvEqualizeHist
该函数为开放计算机视觉(OpenCV)库,用来使灰度图象直方图均衡化。
定义:
voidcvEqualizeHist(constCvArr*src,CvArr*dst);
参数:
src输入的8-比特单信道图图像
dst输出的图像与输入图像大小与数据类型相同
函数cvEqualizeHist采用如下法则对输入图像进行直方图均衡化
1:
计算输入图像的直方图H
2:
直方图归一化,因此直方块和为255
3:
计算直方图积分
4:
采用H'作为查询表:
dst(x,y)=H'(src(x,y))进行图像变换。
该方法归一化图像亮度和增强对比度。
在cvEqualizeHist中,原始图像及目标图像必须是单通道,大小相同的8位图像,对于彩色图像,
必须先将每个通道分开,再分别进行直方图均衡化处理,然后将通道合并形成新的图像。
、
用到了两个重要函数Spli分割多通道数组成几个单通道数组或者从数组中提取一个通道t和Merge从几个单通道
数组组合成多通道数组或插入一个单通道数组。
2)拉普拉斯锐化
cvLaplace计算图像的Laplacian变换(拉普拉斯锐化)
语法:
voidcvLaplace(constCvArr*src,CvArr*dst,intaperture_size=3);
参数:
src输入图像.
dst输出图像.aperture_size核大小(与cvSobel中定义一样).
功能:
函数cvLaplace计算输入图像的Laplacian变换,方法是先用sobel算子计算二阶x-和y-差
分,再求和:
d2srcd2src
对aperture_size=1则给出最快计算结果,相当于对图像采用如下内核做卷积:
01o'
1-41
类似于cvSobel函数,该函数也不作图像的尺度变换,所支持的输入、输出图像类型的组合和cvSobel
致。
3)高斯低通滤波
cvSmooth低通滤波(去噪声)
语法:
CVAPI(void)cvSmooth(constCvArr*src,CvArr*dst,
intsmoothtypeCV_DEFAULT(CV_GAUSSIAN),
intparam1CV_DEFAULT(3),
intparam2CV_DEFAULT(0),doubleparam3CV_DEFAULT(0),doubleparam4CV_DEFAULT(0));
4)阈值切分
基本原理是:
通过设定不同的特征阈值,把图像象素点分为若干类。
基设原始图像为f(x,y),按照一定的准则f(x,y)中找到特征值T,将图像分割为两个部分,分割后
的图像为:
若取:
b0=0(黑),b仁1(白),即为我们通常所说的图像二值化。
函数cvThreshold对单通道数组应用固定阈值操作。
该函数的典型应用是对灰度图像进行阈值操作得到二值图像。
(cvCmpS也可以达到此目的)或者是去掉噪声,例如过滤很小或很大象素值的图像点。
本函数支持的对图像取阈值的方法由threshold_type确定。
形式:
voidcvThreshold(constCvArr*src,CvArr*dst,doublethreshold,doublemax_value,int
threshold_type);
src:
原始数组(单通道,8-bitof32-bit浮点数)°dst:
输出数组,必须与src的类型一致,或者为8-bit。
threshold:
阈值
max_value:
使用CV_THRESH_BINARY和CV_THRESH_BINARY_INV的最大值。
threshold_type:
阈值类型threshold_type=CV_THRESH_BINARY:
女口果src(x,y)>threshold,dst(x,y)=max_value;否贝U,dst(x,y)=0;
threshold_type=CV_THRESH_BINARY_INV:
女口果src(x,y)>threshold,dst(x,y)=0;否贝U,dst(x,y)=max_value.threshold_type=CV_THRESH_TRUNC:
女口果src(x,y)>threshold,dst(x,y)=threshold;否贝Udst(x,y)=src(x,y).
threshold_type=CV_THRESH_TOZERO:
如果src(x,y)>threshold,dst(x,y)=src(x,y);否贝Udst(x,y)=0。
threshold_type=CV_THRESH_TOZERO_INV:
如果src(x,y)>threshold,dst(x,y)=0;否贝Udst(x,y)=src(x,y).
2.4图像复原
1)噪声有椒盐噪声和高斯噪声,程序首先对原始图像加入椒盐噪声或者高斯噪声,然后用中值滤波去除椒盐噪声,均值滤波去除高斯噪声实现图像复原。
2)中值滤波
中值滤波是一种非线性数字滤波器技术,经常用于去除图像或者其它信号中的噪声。
这个设计思想就是检查输入信号中的采样并判断它是否代表了信号,使用奇数个采样组成的观察窗实现这项功能。
观察窗口中的数值进行排序,位于观察窗中间的中值作为输出。
然后,丢弃最早的值,取得新的采样,重复上面的计算过程。
中值滤波要寻找原始图像中对应像素赋灰度值的中间值,这是可以利用冒泡排序法寻找,找到后再赋给目标图像。
2.4特征点检测
1)高斯算子
cvLaplace是计算图像的Laplacian变换,是Intel开源项目opencv中的函数,要使用它应该版本中,由于文件结构有所改变,在连接库中应该添加errorLNK2019:
无法解析的外部符号_cvLaplace。
在程序中包含#include,并且在opencv2.2opencv_imgproc220d.lib,否则会出现连接错误:
voidcvLaplace(constCvArr*像.aperture_size核大小(与cvSobel法是先用sobel算子计算二阶x-和
src,CvArr*
中定义一样y-差分,再求和:
」f、d2srcdst(r^y)=-+
dst,intaperture_size=3);src输入图像.dst输出图).函数cvLaplace计算输入图像的Laplacian变换,方
0
1
o'
1
一」
1
0
S!
1
0
■
表达式
_|
对aperture_size=1则给出最快计算结果,相当于对图像采用如下内核做卷积:
cvSobel一致。
类似于cvSobel函数,该函数也不作图像的尺度变换,所支持的输入、输出图像类型的组合和
2)Sobel算子在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值。
在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量。
Sobel算子根据像素点上下、左右
邻点灰度加权差,在边缘处达到极值这一现象检测边缘。
对噪声具有平滑作用,提供较为精确的边缘方向信息,边缘定位精度不够高。
当对精度要求不是很高时,是一种较为常用的边缘检测方法。
该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。
如果以A代表原始图像,Gx及Gy分别代表经横向及纵向边缘检测的图像,其公式如下:
■|0■4,|
1
—1—2—1
ifX&
-20+2
•A(jVn
000
-10斗1
和+2*1
L*'J
■A
图像的每一个像素的横向及纵向梯度近似值可用以下的公式结合,来计算梯度的大小。
然后可用以下公式计算梯度方向。
"2加
3)Canny算子
Canny边缘检测算法:
stepl:
用高斯滤波器平滑图象;
step2:
用一阶偏导的有限差分来计算梯度的幅值和方向;
step3:
对梯度幅值进行非极大值抑制;
step4:
用双阈值算法检测和连接边缘。
2.5图像变换
1)傅里叶变换
cvDFT
功能:
对图像进行一维或二维的离散傅里叶正变换或反变换
语法:
voidcvDFT(constCvArr*src,CvArr*dst,intflags);
参数:
src输入数组,实数或复数
dst输出数组,与输入数组有相同的类型和大小
flags变换标志,为下面值的组合:
CV_DXT_FORWARD向变换,结果不被缩放
CV_DXT_INVERS逆向变换,结果不被缩放
CV_DXT_SCALE寸结果进行缩放,即用数组元素除以它。
通常,CV_DXT_SCAL和CV_DXT_INVERS可
以组合在一起使用,缩写为CV_DXT_INV_SCALE
CV_DXT_ROW寸输入矩阵中每个独立的行进行正向或逆向变换。
此标志允许用户同时变换多个向量,以减少开销。
这些均为宏定义的常量:
#defineCV_DXT_FORWARD0
#defineCV_DXT_INVERSE1
#defineCV_DXT_SCALE2
#defineCV_DXT_ROWS4
#defineCV_DXT_INV_SCALE(CV_DXT_SCALE|CV_DXT_INVERSE)
2)颜色空间变换
cvCvtColor颜色空间转换函数
语法:
voidcvCvtColor(constCvArr*src,CvArr*dst,intmode)
参数:
src输入的8位整数图像
dst输出的8位整数图像
mode指定的转换模式,包括:
CV_BGR2HS,CV_BGR2HLSCV_BGR2YCrCbCV_YCrCb2BGRCV_RGB2YCrCbCV_YCrCb2RQBCV_BGR2La等。
3.总体方案设计
3.1图像文件读入与显示
图像读入时是通过用户自己选择图像文件打开,利用MFC的单文档结构自带的菜单即可实现。
图像打
开使之显示时要先初始化图像,调用程序里的Initlmage(),接着调用lmageSizeToShow()和OnDraw(CDC*
pDC)使之显示在窗口中间。
3.2图像处理功能的实现
实现图像处理可以借助Menu的Comman(函数实现。
1)打开Resource选项卡,利用Menu下的IDR_MAINFRAME
2)编辑选项。
把需要实现的图像处理功能加进去,并设置快捷键。
3)点击ClassWizard选项打开,在Classname下面找到COpenCVImageProView为选项增加Command
函数。
4)编辑代码。
代码内容为调用CopenhagenCVImageDoc里的具体实现函数。
5)在CopenhagenCVImageDo(添加具体的实现函数。
4.实验结果与分析
4.1彩色转换
原图灰度图
4.2几何变换
1)翻转
原图水平翻转图
垂直翻转
2)旋转45度后的图像
3)放大与缩小处理效果此处就不附图了。
4.3图像增强
1)直方图均衡化
原图均衡化后的图
直方图均衡化是一种点操作,它逐点改变输入图像的灰度值,尽量使各个灰度级别都具有相同的数量的像素点(即输出的直方图是平的),使直方图趋于平衡,这对于图像比较或分割是十分有用的。
由均衡化后的图像可以看出图像对比度增强。
2)拉普拉斯锐化
原图锐化图
图像的能量主要集中在其低频部分,噪声所在的频段主要在高频段,同时图像边缘信息也主要集中在其高频部分[1]。
这将导致原始图像在平滑处理之后,图像边缘和图像轮廓模糊的情况出现。
为了减少这类不利效果的影响,就需要利用图像锐化技术,使图像的边缘变得清晰。
拉普拉斯锐化突出了图像的细节,增强了被模糊的细节。
3)高斯低通滤波
可以看到效果并不明星,但是比原图模糊一些
低通滤波就是允许低频分量通过,去除高频分量,有模糊平滑的作用4)阈值切分
原图阈值切分图
图像阈值分割是一种广泛应用的分割技术,利用图像中要提取的目标区域与其背景在灰度特性上的
差异,把图像看作具有不同灰度级的两类区域(目标区域和背景区域)的组合,选取一个比较合理的阈值,
以确定图像中每个像素点应该属于目标区域还是背景区域,从而产生相应的二值图像。
二
阈值分割法的特点是:
适用于目标与背景灰度有较强对比的情况,重要的是背景或物体的灰度比较
单一,而且总可以得到封闭且连通区域的边界。
4.4图像复原
加椒盐噪声后的图像中值滤波后的图像
由以上两幅图可以清楚地看到中值滤波的作用,对去除椒盐噪声效果很好。
中值滤波的步骤为:
1、将滤波模板(含有若干个点的滑动窗口)在图像中漫游,并将模板中心与图中某个像素位置重合;
2、读取模板中各对应像素的灰度值;
3、将这些灰度值从小到大排列;
4、取这一列数据的中间数据,将其赋给对应模板中心位置的像素。
如果窗口中有奇数个元素,中值取元素按灰度值大小排序后的中间元素灰度值。
如果窗口中有偶数个元素,中值取元素按灰度值大小排序后,中间两个元素灰度的平均值。
因为图像为二维信号,中值滤波的窗口形状和尺寸对滤波器效果影响很大,不同图像内容和不同应用要求往往选用不同的窗口形状和尺寸。
由以上步骤,可以看出,中值滤波对孤立的噪声像素即椒盐噪声、脉冲噪声具有良好的滤波效果。
由于其并不是简单的取均值,所以,它产生的模糊也就相对比较少。
4.5边缘检测
原图Sobel算子
Gaussia算子
Canny算子
边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。
的显著变化通常反映了属性的重要事件和变化。
这些包括(i)深度上的不连续、(ii)表面方向不连续、
性变化和(iv)场景照明变化。
图像属性中
(iii)物质属
4.6图像变换
1)傅里叶变换
原图
傅里叶变换图
图像经过傅立叶变换后,得到的是图像的频域。
也就是频率成分。
这个频率成分表示的意义就是相邻像数之间数值(颜色,亮度等等)的变化,也就是说图像在空间上变化的越快,他对应在频域上的数值就越大。
图像经过傅立叶变换后可以提取图像的轮廓或者边界。
实现过程:
1.首先获取源图像的像素矩阵,
2.接着图像中提取出来一部分和像素矩阵进行傅里叶变换
3.计算功率谱
4.对上面得到的功率谱做对数变换,以压缩灰度范围
5.重新安排四个象限,使原点在图像中心
6.调整显示像素的区间,保证最大值为白色,最小值为黑色
2)颜色空间变换
原图
hsv
hs
H参数表示色彩信息,即所处的光谱颜色的位置。
该参数用一角度量来表示,红、绿、蓝分别相隔120
度。
互补色分别相差180度。
纯度S为一比例值,范围从0到1,它表示成所选颜色的纯度和该颜色最大的纯度之间的比率。
S=0时,
只有灰度。
V表示色彩的明亮程度,范围从0到1。
转换时直接调用cvCvtColor(Image,hsv,CV_BGR2HSV);即可将源图BGR专化为HSV空间。
5.总结与体会
这次课程设计收获很多。
之前学过一点MFC但只是知道个大概,具体操作还不熟悉,而这次设计让
我对C++MFC有了一个更深的认识。
课程设计的第一天我就开始想办法弄清楚整个程序的结构是怎么样的。
主要的类有CMainFrame,Cdoc,CView三个类,了解了这三个类的作用后对整个程序设计就有了思路。
值得一提的是调试程序的复杂,有的功能调了一天最后也没能实现,因为自己对处理方法的原理掌握的不透彻,
还有对程序已定义的变量的理解的偏差,再有就是一些函数的参数理解不透彻。
当然,调试的过程也加深了我对图像处理函数的认识,是我在编程中巩固所学知识,锻炼了自己动手开发能力。
参考文献(参考以下格式)
[1]图像处理和分析教程人民邮电出版社
[2]XX百科