图象处理基本算法.docx
《图象处理基本算法.docx》由会员分享,可在线阅读,更多相关《图象处理基本算法.docx(26页珍藏版)》请在冰豆网上搜索。
图象处理基本算法
形态学一般是使用二值图像,进行边界提取,骨架提取,孔洞填充,角点提取,图像重建。
基本的算法:
膨胀腐蚀,开操作,闭操作,击中击不中变换
几种算法进行组合,就可以实现一些非常复杂的功能,而且逻辑严密。
这里给出形态学的一般原理,以及用形态学进行边界提取,角点提取好骨架提取的原代码
一 引言
数学形态学是一门建立在集论基础上的学科,是几何形态学分析和描述的有力工具。
数学形态学的历史可回溯到19世纪。
1964年法国的Matheron和Serra在积分几何的研究成果上,将数学形态学引入图像处理领域,并研制了基于数学形态学的图像处理系统。
1982年出版的专著《ImageAnalysisandMathematicalMorphology》是数学形态学发展的重要里程碑,表明数学形态学在理论上趋于完备及应用上不断深入。
数学形态学蓬勃发展,由于其并行快速,易于硬件实现,已引起了人们的广泛关注。
目前,数学形态学已在计算机视觉、信号处理与图像分析、模式识别、计算方法与数据处理等方面得到了极为广泛的应用。
数学形态学可以用来解决抑制噪声、特征提取、边缘检测、图像分割、形状识别、纹理分析、图像恢复与重建、图像压缩等图像处理问题。
该文将主要对数学形态学的基本理论及其在图像处理中的应用进行综述。
二 数学形态学的定义和分类
数学形态学是以形态结构元素为基础对图像进行分析的数学工具。
它的基本思想是用具有一定形态的结构元素去度量和提取图像中的对应形状以达到对图像分析和识别的目的。
数学形态学的应用可以简化图像数据,保持它们基本的形状特征,并除去不相干的结构。
数学形态学的基本运算有4个:
膨胀、腐蚀、开启和闭合。
它们在二值图像中和灰度图像中各有特点。
基于这些基本运算还可以推导和组合成各种数学形态学实用算法。
(1)二值形态学
数学形态学中二值图像的形态变换是一种针对集合的处理过程。
其形态算子的实质是表达物体或形状的集合与结构元素间的相互作用,结构元素的形状就决定了这种运算所提取的信号的形状信息。
形态学图像处理是在图像中移动一个结构元素,然后将结构元素与下面的二值图像进行交、并等集合运算。
基本的形态运算是腐蚀和膨胀。
在形态学中,结构元素是最重要最基本的概念。
结构元素在形态变换中的作用相当于信号处理中的“滤波窗口”。
用B(x)代表结构元素,对工作空间E中的每一点x,腐蚀和膨胀的定义为:
用B(x)对E进行腐蚀的结果就是把结构元素B平移后使B包含于E的所有点构成的集合。
用B(x)对E进行膨胀的结果就是把结构元素B平移后使B与E的交集非空的点构成的集合。
先腐蚀后膨胀的过程称为开运算。
它具有消除细小物体,在纤细处分离物体和平滑较大物体边界的作用。
先膨胀后腐蚀的过程称为闭运算。
它具有填充物体内细小空洞,连接邻近物体和平滑边界的作用。
可见,二值形态膨胀与腐蚀可转化为集合的逻辑运算,算法简单,适于并行处理,且易于硬件实现,适于对二值图像进行图像分割、细化、抽取骨架、边缘提取、形状分析。
但是,在不同的应用场合,结构元素的选择及其相应的处理算法是不一样的,对不同的目标图像需设计不同的结构元素和不同的处理算法。
结构元素的大小、形状选择合适与否,将直接影响图像的形态运算结果。
因此,很多学者结合自己的应用实际,提出了一系列的改进算法。
如梁勇提出的用多方位形态学结构元素进行边缘检测算法既具有较好的边缘定位能力,又具有很好的噪声平滑能力。
许超提出的以最短线段结构元素构造准圆结构元素或序列结构元素生成准圆结构元素相结合的设计方法,用于骨架的提取,可大大减少形态运算的计算量,并可同时满足尺度、平移及旋转相容性,适于对形状进行分析和描述。
(2)灰度数学形态学
二值数学形态学可方便地推广到灰度图像空间。
只是灰度数学形态学的运算对象不是集合,而是图像函数。
以下设f(x,y)是输入图像,b(x,y)是结构元素。
用结构元素b对输入图像y进行膨胀和腐蚀运算分别定义为:
对灰度图像的膨胀(或腐蚀)操作有两类效果:
(1)如果结构元素的值都为正的,则输出图像会比输入图像亮(或暗);
(2)根据输入图像中暗(或亮)细节的灰度值以及它们的形状相对于结构元素的关系,它们在运算中或被消减或被除掉。
灰度数学形态学中开启和闭合运算的定义与在二值数学形态学中的定义一致。
用b对f进行开启和闭合运算的定义为:
(3)模糊数学形态学
将模糊集合理论用于数学形态学就形成了模糊形态学。
模糊算子的定义不同,相应的模糊形态运算的定义也不相同。
在此,选用Shinba的定义方法。
模糊性由结构元素对原图像的适应程度来确定。
用有界支撑的模糊结构元素对模糊图像的腐蚀和膨胀运算按它们的隶属函数定义为:
其中,x,y∈Z2代表空间坐标,ua,ub分别代表图像和结构元素的隶属函数。
从(7),(8)式的结果可知,经模糊形态腐蚀膨胀运算后的隶属函数均落在[0,1]的区间内。
模糊形态学是传统数学形态学从二值逻辑向模糊逻辑的推广,与传统数学形态学有相似的计算结果和相似的代数特性。
模糊形态学重点研究n维空间目标物体的形状特征和形态变换,主要应用于图像处理领域,如模糊增强、模糊边缘检测、模糊分割等。
三 数学形态学在图像处理中的主要应用
近年来,数学形态学在图像处理方面得到了日益广泛的应用。
下面主要就数学形态学在边缘检测、图像分割、图像细化以及噪声滤除等方面的应用做简要介绍。
(1) 边缘检测
边缘检测是大多数图像处理必不可少的一步,提供了物体形状的重要信息。
对于二值图像,边缘检测是求一个集合A的边界,记为B(A):
对于灰度图像,边缘检测是求一幅图像的形态学梯度,记为g:
数学形态学运算用于边缘检测,存在着结构元素单一的问题。
它对与结构元素同方向的边缘敏感,而与其不同方向的边缘(或噪声)会被平滑掉,即边缘的方向可以由结构元素的形状确定。
但如果采用对称的结构元素,又会减弱对图像边缘的方向敏感性。
所以在边缘检测中,可以考虑用多方位的形态结构元素,运用不同的结构元素的逻辑组合检测出不同方向的边缘。
梁勇等人构造了8个方向的多方位形态学结构元素,应用基本形态运算,得到8个方向的边缘检测结果,再把这些结果进行归一化运算、加权求和,得到最终的图像边缘。
该算法在保持图像细节特征和平滑边缘等方面,取得了较好的效果。
边缘检测源代码:
1./********************************************************************
2.形态学基本操作采用二值图像
3.***********************************************************************/
4.#include
5.#include
6.int main(){
7. IplImage * image,*image2,*image3;
8. image = cvLoadImage("E:
\\image\\mapleleaf.tif", 0);
9. cvNamedWindow("image",1);
10. cvShowImage("image",image);
11.
12.
13. /*边界提取*/
14. image2 = cvCreateImage(cvSize(image->width, image->height),image->depth ,1);
15. image3 = cvCreateImage(cvSize(image->width, image->height),image->depth ,1);
16. int i , j ;
17. int left,right, up , down;
18. int n = 2;//窗口大小为5*5
19. int r,s,flag;
20. unsigned char * ptr, *dst;
21. for (i = 0 ; i< image->height; i++)
22. {
23. for (j = 0 ; j< image->width; j++)
24. {
25. //窗口设定
26. left = j - n;
27. right = j +n;
28. up = i -n;
29. down = i+n;
30. //窗口出界处理
31. if(left< 0){left = 0;}
32. if(right >= image->width){right = image->width-1;}
33. if(up< 0){up =0;}
34. if(down >= image->height){down = image->height -1;}
35.
36. //腐蚀处理
37. dst = (unsigned char *)image2->imageData + image2->widthStep*i + j;
38. flag = 1;
39. for (r = up;r <= down;r++)
40. {
41. for (s = left ; s<= right; s++)
42. {
43. ptr = (unsigned char *)image->imageData + r*image->widthStep + s;
44.
45. if(*ptr !
= 255){
46. flag = 0;
47. }
48. }
49. }
50. if (flag == 1)
51. {
52. *dst = 255;
53. }
54. else{
55. *dst = 0;
56. }
57.
58. }
59. }
60. cvSub(image,image2,image3,0);
61. cvNamedWindow("image3",1);
62. cvShowImage("image3",image3);
63. cvSaveImage("mapleleafboard.bmp", image3);
64. cvWaitKey(0);
65. cvReleaseImage(&image);
66. cvReleaseImage(&image2);
67. cvReleaseImage(&image3);
68. cvDestroyAllWindows();
69. return 0 ;
70.}
原图:
边界提取:
(2) 图像分割
基于数学形态学的图像分割算法是利用数学形态学变换,把复杂目标X分割成一系列互不相交的简单子集X1,X2,…,XN,即:
对目标X的分割过程可按下面的方法完成:
首先求出X的最大内接“圆”X1,然后将X1从X中减去,再求X-X1的最大内接“圆”X2,…,依此类推,直到最后得到的集合为空集为止。
下面以二值图像为例,介绍用数学形态学方法求解子集X1,X2,…,XN的过程。
设B为结构元素,B可以是圆、三角形、正方形等简单的几何基元,那么“简单”形状集合Xi可以用下面的公式来定义:
式中ni为一整数,用上式定义Xi分割目标,有时会产生分割过程不唯一的现象。
为此可采用下面公式来定义简单集合Xi:
其中Li为一个点或一条线,当Li为点时,则与(12)式定义等价。
(13)式定义的简单形状Xi可由niB沿线Li移动而产生。
即将“产生器”niB的中心沿“脊骨”Li移动产生。
如果niB为圆,则得到的Xi称Blum带。
它具有一些特殊的性质,如Xi的边界是光滑的,Xi的最大圆与其边界相切,Xi的脊骨与产生器都是唯一的等等。
有了简单形状集合Xi的定义,则目标X可按下面方法分割。
首先按式(14)求出X的最大内切结构元素Xi:
数学形态学用于图像分割的缺点是对边界噪声敏感。
为了改善这一问题,刘志敏等人提出了基于图像最大内切圆的数学形态学形状描述图像分割算法和基于目标最小闭包结构元素的数学形态学形状描述图像分割算法,并使用该算法对二值图像进行了分割,取得了较好的效果。
邓世伟等人提出一种基于数学形态学的深度图像分割算法。
作者首先利用形态学算子获得分别含有阶跃边缘与屋脊边缘的凸脊和凹谷图像,然后利用控制区域生长过程得到最终的分割结果。
与传统方法相比,该方法速度快,抗噪性能好。
(3) 形态骨架提取
形态骨架描述了物体的形状和方向信息。
它具有平移不变性、逆扩张性和等幂性等性质,是一种有效的形状描述方法。
二值图像A的形态骨架可以通过选定合适的结构元素B,对A进行连续腐蚀和开启运算来求取,设S(A)代表A的骨架,定义为:
蒋刚毅等人运用数学形态学方法,对交通标志的内核形状提取形态骨架函数,将其作为用于模式匹配的形状特征。
A的形态骨架函数SKF(A)表示为:
SKF(X)中值较大的点对应大的n,并代表了形态骨架的主要成分,即表达了形状的主体结构;而SKF(X)中值较小的点对应小的n,是形态骨架的细节成分,与形状的边缘信息相联系。
形态骨架函数完整简洁地表达了形态骨架的所有信息,因此,根据形态骨架函数的模式匹配能够实现对不同形状物体的识别。
算法具有位移不变性,因而使识别更具稳健性。
骨架提取原代码:
1./************************************************************************/
2./* 骨架提取*/
3./************************************************************************/
4.#include
5.#include
6.int main(){
7. IplImage* image = cvLoadImage("E:
\\image\\bone.tif",0);
8. cvNamedWindow("image",1);
9. cvNamedWindow("image2",1);
10. cvNamedWindow("image3",1);
11. cvNamedWindow("image4",1);
12. cvNamedWindow("image5",1);
13. cvNamedWindow("image6",1);
14.
15. cvNamedWindow("result",1);
16. cvShowImage("image", image);
17. //cvWaitKey(0);
18. //当前图片image2 当前被腐蚀后的图片image3 被腐蚀开操作之后的图片 image5
19. //image4 作为开操作的中间值 作差后的图片image6 并之后的图片result
20. IplImage *image2, *image3 , *image4, *image5,*image6,*result;
21. image2 = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);
22. image3 = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);
23. image5 = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);
24. image4 = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);
25. image6 = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);
26. result = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);
27.
28. //循环标志 flag
29. bool flag = true;
30. //腐蚀判断标志 flag2
31. bool flag2 = true;
32. int i,j,r,s;
33. unsigned char * ptr,*dst;
34. unsigned char B[9] = {255 ,255,255,255,255,255,255,255,255};
35. //对result进行赋值 全部为0
36. for (i = 0 ; i< result->height; i++)
37. {
38. for (j = 0 ; j< result->width ; j++)
39. {
40. dst = (unsigned char *)(result->imageData + result->widthStep *i +j);
41. *dst = 0;
42. }
43. }
44. image2 = cvCloneImage(image);
45. cvShowImage("image2", image2);
46. //cvWaitKey(0);
47. while (flag)
48. {
49. //flag = false;
50. cvShowImage("image2",image2);
51. //进行腐蚀操作,开环操作 作差 并
52. for (i = 0 ; i< image3->height; i++)
53. {
54. for (j = 0 ; j< image3->width ; j++)
55. {
56. dst = (unsigned char *)(image3->imageData + i*image3->widthStep + j);
57. if ((i == 0 )|| (j == 0) ||( i == image->height -1 ) || (j == image->width -1 ))
58. {
59. *dst = 0;
60. //break;
61. }
62. else{
63. flag2 = true;
64. for (r = i-1 ; r<= i+1 ; r++)
65. {
66. for (s = j -1 ; s<= j+1 ; s++)
67. {
68. ptr = (unsigned char *)(image2->imageData + r*image2->widthStep + j);
69. if(*ptr !
= 255){
70. flag2 =false;
71. }
72. }
73. }
74.
75. if (flag2)
76. {
77. *dst = 255;
78. }
79. else {*dst = 0;}
80. }
81. }
82. }
83. cvShowImage("image3",image3);
84.
85.
86. //开操作 先腐蚀 后膨胀
87. for (i = 0 ; i< image4->height; i++)
88. {
89. for (j = 0 ; j< image4->width ; j++)
90. {
91.