图像放大示意图:
当kx=ky=2时,原图像中的某一个像素对应新图中的4个像素。
图像缩小示意图:
当kx=ky=0.5时,原图像中的某4个像素对应新图的1个像素。
③图像的旋转
图像的旋转必须指明图像绕着什么旋转。
本次实习中是围绕图像的中心旋转,旋转一定的角度。
旋转后,图像的大小一般会改变。
图像上的点(x0,y0)经过旋转α度后坐标变为(x1,y1)。
④图像的转置
图像的转置是将图像像素的x坐标做对称变换。
3.滤波
低通滤波:
掩模不同,中心点或邻域的重要程度也不相同,因此,应根据问题的需要选取合适的掩模。
但不管什么样的掩模,必须保证全部权系数之和为单位值,这样可保证输出图像灰度值在许可范围内,不会产生“溢出”现象。
任何一幅原始图像,在其获取和传输等过程中,会受到各种噪声的干扰,使图像恶化,质量下降,图像模糊,特征淹没,对图像分析不利。
低通滤波可以抑制噪声改善图像质量。
中值滤波:
是一种非线性的信号处理方法,与其对应的中值滤波器也是一种非线性的滤波器。
特别适合处理胡椒粉式或脉冲式的干扰。
中值滤波一般采用一个含有奇数个点的滑动窗口,将窗口中各点灰度值的中值来代替指定点(一般是窗口的中心点)的灰度值。
高通滤波:
法就是用高通滤波算子和图像卷积来增强边缘。
常用的算子有:
4.线性灰度变换
点运算是指像素值(即像素点上的灰度值)通过运算改变之后,可以改善图象的显示效果。
这是一种像素的逐点运算,是旧图象与新图象之间的映射关系,是一种简单但却十分有效的一种图象处理手段。
常用方法有灰度线性变换、直方图均衡、对比度调整、直方图规定化、对数变换、指数变换、密度分割等方法。
灰度的线性变换就是指图像的中所有点的灰度按照线性灰度变换函数进行变换。
灰度变换方程如下:
灰度值上移或下移,更亮或更暗
输出图像的对比度将增大
该方程为线性方程。
式中参数
为输入图像的像素的灰度值,参数
为输出图像的
5.边缘检测
边缘能够勾画出目标物体,使观察者一目了然。
边缘粗略分为阶跃状边缘和屋顶状边缘两种。
边缘提取首先检出图像局部特征的不连续性,然后再将这些不连续的边缘像素连成完备的边界。
边缘的特性是沿边缘走向的像素变化平缓,而垂直于边缘方向的像素变化剧烈。
所以,从这个意义上说,提取边缘的算法就是检出符合边缘特性的边缘像素的数学算子。
本次实习中用到的算子有:
Roberts算子、Sobel算子、Prewitt算子。
Roberts算子Sobel算子Prewitt算子
6.直方图均衡化
先算出一幅图像中各个灰度级rk(k=0,1,2,…,L-1)出现的概率:
Pk(rk)=
k=0,1,2,…,L-1
n是图像中象素的总和,nk是灰度级为rk的象素个数,L为图像中灰度级别的总数。
这也是我们绘制原始图像直方图的依据。
直方图均衡化的变换函数:
Sk=T(rk)=
=
k=0,1,2,…,L-1
其中Sk为原灰度级为rk的像素经直方图均衡化变换后的灰度。
根据计算得到的累积分布函数,建立输入图象与输出图象灰度级之间的对应关系,并将变换后灰度级恢复成原先数范围。
7.二值化
一、状态法
如果一幅灰度图像的直方图有双峰和明显的谷,如图9-1,那么选择两峰之间的谷所对应的灰度T作为阈值,按下式进行二值化,即可将目标从图像中分割出来。
0f(x,y)<T
g(x,y)=图9-1灰度直方图
1f(x,y)≥T
二、判断分析法
假定简单图像f(x,y)的灰度区间为[0,L-1],则选择一阈值T将图像的像素分为c1、c2两组。
c1f(x,y)<T像素数为w1,灰度平均值为m1,方差为σ12
c2f(x,y)≥T像素数为w2,灰度平均值为m2,方差为σ22
图像总像素数为w1+w2,灰度均值为m=(m1w1+m2w2)/(w1+w2),组内方差为σw2=w1σ12+w2σ22,组间方差为σB2=w1(m1-m)2+w2(m2-m)2=w1w2(m1-m2)2
显然,组内方差越小,则组内像素越相似;组间方差越大,则组间的差别越大。
因此,σB2/σw2为最大值所对应的T,就是所求判断分析法的分割阈值
8.特征提取
加深对图像纹理分析方法的理解与应用,掌握纹理图像的自相关函数分析方法和灰度共生矩阵特征提取与分析方法,启发学生深入研究纹理分析方法,提高学生图像处理与分析能力和实际动手能力。
灰度共生矩阵是从图像灰度为i的像素(x,y)出发,统计与距离为δ、灰度为j的像素(x+△x,y+△y)同时出现的概率P(i,j,δ,θ),即
1)二阶矩
二阶矩反映了图像灰度分布均匀程度和纹理粗细度。
因为它是灰度共生矩阵各元素的平方和,又称为能量。
大时纹理粗,能量大;反之,
小时纹理细,能量小。
2)对比度(惯性矩)
对比度可以理解为图像的清晰度。
纹理的纹沟深,
大,效果清晰;反之,
小则纹沟浅,效模糊。
3)相关
式中
,
,
,
分别定义为:
相关用来衡量灰度共生矩阵在行或列方向上的相似度。
4)熵
它反映图像中纹理的复杂程度或非均匀度。
若纹理复杂,熵具有较大值;反之,若图像中灰度均匀,共生矩阵中元素大小差异大,熵较小。
5)逆差矩
若希望提取具有旋转不变性的特征,简单的方法是对θ取0º、45º、90º、135º的同一特征求平均值和均方差。
9.模板匹配
模板匹配是根据模板与一幅图像的各部分的相似度判断其是否存在,并求得模板在图像中位置的操作。
设模板T叠放在搜索图像S上平移,模板覆盖的搜索区叫做子图像Si,j,i,j为子图像的左上角在S图像中的坐标,i,j的取值范围为1
衡量子图像和模板之间的差别用平差之和或绝对差之和来表示,即
相关函数作为相似性测度
归一化为
三、实习过程和步骤
1.图像格式转换
1.建立RawToBmp的对话框
插入一个新对话框,属性改为IDD_DIALOG_RAWTOBMP。
在上面加上四个编辑框(一个输入打开Raw文件的路径,一个输出保存Bmp文件的路径,两个用来输入Bmp文件的宽和高),两个浏览按钮,5个单选按钮(其中BSQ和Gray属性设为GROUP)。
利用类向导插入此对话框类CRawToBmpDlg,并未两个编辑框定义两个CString变量m_sRawIn,m_sBmpOut和两个整型变量m_iHeight,m_iWidth。
为两个浏览按钮添加响应函数。
2.编写“确定”按钮的响应函数OnOK()
利用类向导为确定按钮添加响应函数,ClassName选CRawToBmpDlg。
3.为OK键添加消息响应函数,分别定义BMP格式文件前三部分数据变量,计算出各变量的值,并且利用一个CFile对象获取Raw图像的数据,利用另一个CFile对象将数据存储到所输入的路径的文件中去,CFile对象的Read函数会自动创建一个文件。
4.在菜单上新建一个弹出菜单“格式转换”,在其下新建菜单“RawtoBmp”,为菜单添加消息响应函数,在其消息响应函数里创建RowToBMP对话框。
这样点击菜单后就会弹出一个对话框,按确定键之后就可以读取Raw文件并且存储BMP文件,完成整个消息循环。
2.图像几何变换
1.添加菜单“几何变换”——“平移”、“图像缩放”、“图像旋转”、“转置”。
其中平移、缩放、旋转需创建对话框用来输入相关参数。
利用类向导为菜单添加响应函数。
2.平移:
建立COORDMOVE的对话框
插入一个新对话框,属性改为IDD_COORDMOVE。
获取原图的数据指针;
添加菜单资源后,我们为每个菜单项添加响应函数,我们首先要有一份对原图信息的拷贝,得到当前图像长宽和像素信息后,我们只需在循环体中添加不同的代码即可。
3.图像缩放
建立ZOOM的对话框
插入一个新对话框,属性改为IDD_ZOOM。
循环体中添加不同的代码:
图像缩放仅仅是将平移中的平移量转换成缩放量ZOOM。
在循环体中,添加缩放的代码即可。
通过对话框获得放大整数比例:
kx,ky。
更改图像的宽度和高度。
每个像素依次循环。
计算该像素在原图像中的坐标,将原图像的像素值赋给目标像素对应位置kx×ky个值。
将新图赋给当前文档图像,刷新视图。
4.图像旋转
建立ROTATION的对话框
插入一个新对话框,属性改为IDD_ROTATION。
循环体中添加不同的代码:
图像缩放仅仅是将平移中的平移量根据旋转角存在指针之中。
在循环体中,添加旋转的代码即可。
1、定义旋转角度的正弦和余弦
2、定义旋转前和旋转后以图像中心为坐标原点,图像四个角的坐标
3、计算原图四个角度的坐标
4、计算新图像四个角度的坐标
5、计算旋转后图像的长和宽
5.转置
图像的转置是将图像像素的x坐标做对称变换。
3.滤波
添加菜单项。
在已添加的“图像增强”中添加菜单“局部处理”。
在弹出的菜单中依次添加“低通滤波”,“高通滤波”和“中值滤波”。
利用类向导分别为它们添加相应函数OnLow()、OnHight()、OnMid()。
前面的定义指针操作相同:
定义指针完成后,先建立好对话框。
高通和低通滤波我设计的需要通过对话框来输入算子计算。
高通和低通滤波即分别在算法仅仅是计算算子的时候有不同。
高通滤波是只针对低于某一给定频率以下的频率成分有衰减作用,而允许这个截频以上的频率成分通过,并且没有相位移的滤波过程,主要用来消除低频噪声,对图像有一定的锐化作用:
低通滤波是低频信号能正常通过,而没有设定临界值的高频信号则被阻隔、减弱。
但是阻隔、减弱的幅度则会依据不同的频率以及不同的滤波目的而改变。
主要用于过滤高频部分,对图像有一定的平滑作用:
中值滤波的响应函数和前面两个略有不同。
主体部分代码:
中值滤波是一种典型的低通滤波器,它的目的是去除噪声,同时能保护图像边缘。
中值滤波一般采用一个含有奇数个点的滑动窗口,将窗口中各点灰度值的中值来代替指定点(一般为窗口中心)的灰度值。
对于奇数个元素,中值是取窗口中各元素按由小大排序后中间的灰度值;对于偶数个元素,一般取排序后中间两个元素灰度值的平均值为中值。
4.线性灰度变换
在菜单中增加“点运算”,建立消息响应函数。
函数中前面部分的指针依旧相同,后面的代码有老师给我们的代码改编而成。
点运算是指像素值(即像素点上的灰度值)通过运算改变之后,可以改善图像的显示效果。
这是一种像素的逐点运算,是旧图像与新图像之间的映射关系,是一种简单但却十分有效的一种图象处理手段。
5.边缘检测
在菜单中添加边缘检测算子,在菜单项中添加“边缘检测”,再为“边缘检测”菜单添加子菜单项“Roberts算子”,“Prewitt算子”,“Sobel算子”和“自定义”菜单项;为新加的菜单项建立消息处理函数。
为自定义算子建立对话框:
对菜单项里的算子建立消息响应函数,在几个算子的函数中,前面依旧是相同的指针赋值,将图片赋值。
几个算子的区别仅仅是算子计算边缘时候的算法略有不同。
Robert:
Prewitt:
Sobel:
自定义算子通过对话框来输入算子。
先定义对话框中编辑栏:
然后定义指针变量同上面几步:
6.直方图均衡化
在弹出菜单“图像增强”下添加菜单“直方图均衡化”,为菜单设置消息响应函数,在菜单消息响应函数,完成对图像的处理。
指针定义后,在直方图均衡化中需先统计出个灰度值的个数,然后通过函数映射得到均衡化后原图像中灰度值在新图像中灰度值的大小:
图像的直方图事实上就是图像的亮度分布的概率密度函数,是一幅图像的所有象素集合的最基本的统计规律。
直方图反映了图像的明暗分布规律,可以通过图像变换进行直方图调整,获得较好的视觉效果。
直方图均衡化的基本思想是把原始图的直方图变换为均匀分布的形式,这样就增加了象素灰度值的动态范围从而可达到增强图像整体对比度的效果。
7.二值化
在弹出菜单“二值化”下,添加“状态法”和“判断分析法”的子菜单;添加子菜单的消息响应函数。
添加消息响应函数,函数的开头依旧是指针赋值读取图像。
两个函数第一步都是检测灰度值:
中间部分有所不同:
状态法(谷峰法):
判断分析法:
结尾部分显示阈值:
在状态法中使用迭代去逼近阈值,然后对原图像将灰度值小于阈值的设为0,将灰度值大于阈值的变为255,首先求出图像中的最大和最小灰度值,其次通过迭代求出阈值,最后用阈值将图像二值化。
判断分析法跟状态法类似,二者主要区别在于如何确定阈值,判断分析法的确定阈值的代码,同上代码。
8.特征提取
灰度共生矩阵是从图像灰度为i的像素(x,y)出发,统计与距离为δ、灰度为j的像素(x+△x,y+△y)同时出现的概率P(i,j,δ,θ)
在菜单中添加“特征提取”,在其中添加子菜单“灰度共生矩阵”,添加消息响应函数。
第一步依然是指针赋值,然后分别定义二阶矩,对比度(惯性矩),相关,熵,逆差矩:
然后统计图像中数据,最后输出灰度共生矩阵。
9.模板匹配
在菜单中添加“模板匹配”,添加子菜单“基于灰度的模板匹配”,为菜单添加响应函数。
首先创建一个对话框:
首先我们要从对话框中得到一个模板,用这个模板与原图匹配,找到模板在图中的位置,并标记出来。
我们根据模板图案与原图像各部分灰度的相似程度来判断其是否存在于原图像中。
详细代码见程序。
四、实习结果分析与评价
1.图像格式转换
程序过程:
编辑RAW格式图像,将输出的图像保存。
Raw的参数设置,将此RAW图像转换成BMP格式图像。
算法分析:
将RAW格式图像转换成BMP格式图像。
转换灰度图像和彩色图像;逐波段存储、逐行存储、逐像素存储。
算法改进:
只能通过图像的长度和宽度转换图像。
2.图像几何变换
程序过程:
平移:
通过调整对话框的XY方向进行平移操作。
缩放:
通过调整放大缩小倍数。
旋转:
输入旋转角度,即可对图像进行旋转。
转置:
点击实现功能。
算法分析:
平移运用橡皮筋技术,可以避免输入移动距离的盲目性来实现平移;缩放、旋转只要输入参数即可实现功能;4个算法的总体思路的一样的,首尾的代码是相同的,只是中间循环部分要根据实现的不同功能来进行编程。
算法改进:
缩放之后图像不清晰。
3.滤波
程序过程:
原图像:
低通滤波:
高通滤波:
中值滤波:
算法分析:
能通过模板来修改,根据不同要求实现。
算法改进:
添加5*5模板。
4.线性灰度变换
程序过程:
原图像:
点运算:
算法分析:
在曝光不足或过度的情况下,图像灰度可能会局限在一个很小的范围内。
这时在显示器上看到的将是一个模糊不清、灰度层次少的图像。
对曝光不足的图像采用线性变换,即对图像每一个像素灰度作线性拉伸,可有效地改善图像视觉效果。
算法改进:
不能通过用户自己的需求进行线性灰度变化。
5.边缘检测
程序过程:
原图像:
Roberts算子:
Prewitt算子:
Sobel算子:
算法分析:
添加了自定义算子,增加了用户的需求;算法的整体思路大致相同,都是用模板与图像的灰度值进行了卷积运算,表示模板信息的数组的值不同。
算法改进:
算子可以进行拓展。
6.直方图均衡化
程序过程:
原图像:
直方图均衡化:
算法分析:
直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。
用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。
通过这种方法,亮度可以更好地在直方图上分布。
这样就可以用于增强局部的对比度而不影响整体的对比度。
算法改进:
能够显示直方图,使之更加明了。
7.二值化
程序过程:
状态法(谷峰法):
判断分析法:
算法分析:
给用户计算并显示阈值。
算法改进:
能够更改阈值。
8.特征提取
程序过程:
灰度共生矩阵:
算法分析:
能够显示灰度共生矩阵的值。
算法改进:
不能更改使之显示纹理特征效果。
9.模板匹配
程序过程:
算法分析:
打开点击菜单中模板匹配的相应选项,从地址中找到模板,点击确定即可开始模板匹配。
若匹配成功,程序会弹出“匹配成功”的对话框,并将目标模板贴在原图上并用黑框标出。
算法改进:
匹配的速度太慢。
五、实习总结与体会
两周的实习数字图像处理实习已经结束,在这段时间,我们通过编程学会了很多以前无法想象的事情。
或许以前根本不理解为什么这些图像能能够有这样或者那样的变化。
经过这次实习之后,我想我也能说出许多PS的处理道理了。
在这次实习中,通过实际的亲自动手边写程序来对数字图像进行个各种各样的处理,大大加深了我们对数字图像处理理论的认知,在短短的两个星期,我的专业知识得到了显著的提高。
通过实习,使得原本比较模糊的知识变得生动。
经过了这样的一个经历,我对图像有了更加深刻的认识。
在程序员心里,图像重要的不是那感性的色彩,更加重要的是那些色彩的排列方式。
在实习中,难免会遇到各种各样的问题,我还是比较喜欢向周围会的同学询问。
但是,同学们也毕竟是在探索中,更多的还是向老师进行咨询。
在一个又一个的错误之后,是一次又一次的实验。
只有在这些错误的底蕴之下,我们的程序才能经受住考验。
不断地调试才是一个程序的宿命。
在这次实习中,我学到的最大的就是经常保存。
这次实习结束了,我的文件夹里存了许多的存档。
因为在一开始实习的时候,因为一些错误往往导致整个程序的从头来过,非常之浪费时间。
因为错误是难以避免的,但是,我们的程序是可以存档的,这样就让我们有资本来不断的尝试。
在尝试中,只有把一些有的没的统统去试一遍,把所有可能会出错的地方仔仔细细的看过去,我们才能发现循环到底在哪里出现了错误。
一味的照着书上敲打代码,只会让我们的程序走向失败。
认真对待在实习中出现的错误,然后以后尽量这些错误。
作为一个程序员,我们要深入的了解一个算法的每一步,通过不断的改进来提高算法的效率。
编程要的是不怕烦躁的心,没有耐心,不能冷静的思考是无法完成一个完美的程序的。
本次实习,激发了我对于程序的向往。
当你编写出一个能完美运行的程序时,内心的开心无以言表。
这次实习,也让我更加深刻理解了数字图像处理里面的一些名词实际的意义,比如灰度共生矩阵等等。
这些东西都让我在专业知识上能加深理解。
可以说,这次实习,让我们对数字图像处理由理论上那比较飘渺的东西变成了触手可及并且为之骄傲的程序。
最后,在这里还是要感谢老师在这两礼拜的实习耐心的讲解。
我们也麻烦了老师许多,甚至有很多在老师看来很简单的问题。
老师依旧很细心的为我们讲解,让我们在这实习之中真正的学会了数字图像的编程。
在实习中,有不会的地方,我们几个同学一起探讨着问题出现的原因,不断的弥补自己的缺陷,不断完善自我的学习,在交流合作中有团队合作的概念,以便于未来的学习与工作。
成绩评定
项目
得分
文字正确、语句通顺,内容充实、详略得当(10分)
原理叙述清楚(10分)
算法设计正确(20分)
过程清楚、步骤详细(20分)
对实验结果分析恰当、能分析算法的优点和不足,并叙述正确(20分)
成果验收答辩讲叙清楚、回答问题正确(20分)
发现有拷贝、雷同、抄袭(视情况扣大于30分)
总成绩
教师签名