图像的腐蚀和膨胀
- 格式:ppt
- 大小:801.00 KB
- 文档页数:3
C++图像的膨胀和腐蚀二值图像是一种简单的图像格式,它只有两个灰度级,即"0"表示黑色的像素点,"255"表示白色的像素点,至于如何从一幅普通的图像获得二值图像,请参考我近期在天极网上发表的《Visual C++编程实现图像的分割》一文。
二值图像处理在图像处理领域占据很重要的位置,在具体的图像处理应用系统中,往往需要对于获得的二值图像再进一步进行处理,以有利于后期的识别工作。
二值图像处理运算是从数学形态学下的集合论方法发展起来的,尽管它的基本运算很简单,但是却可以产生复杂的效果。
常用的二值图像处理操作有许多方法,如腐蚀、膨胀、细化、开运算和闭运算等等。
本文对这些内容作些研究探讨,希望对爱好图像处理的朋友有所帮助。
一、腐蚀和膨胀形态学是一门新兴科学,它的用途主要是获取物体拓扑和结果信息,它通过物体和结构元素相互作用的某些运算,得到物体更本质的形态。
它在图像处理中的应用主要是:1.利用形态学的基本运算,对图像进行观察和处理,从而达到改善图像质量的目的;2.描述和定义图像的各种几何参数和特征,如面积,周长,连通度,颗粒度,骨架和方向性。
限于篇幅,我们只介绍简单二值图像的形态学运算,对于灰度图像的形态学运算,有兴趣的读者可以看有关的参考书。
二值图像基本的形态学运算是腐蚀和膨胀,简单的腐蚀是消除物体的所有边界点的一种过程,其结果是使剩下的物体沿其周边比原物体小一个像素的面积。
如果物体是圆的,它的直径在每次腐蚀后将减少两个像素,如果物体在某一点处任意方向上连通的像素小于三个,那么该物体经过一次腐蚀后将在该点处分裂为二个物体。
简单的膨胀运算是将与某物体接触的所有背景点合并到该物体中的过程。
过程的结果是使物体的面积增大了相应数量的点,如果物体是圆的,它的直径在每次膨胀后将增大两个像素。
如果两个物体在某一点的任意方向相隔少于三个像素,它们将在该点连通起来。
下面给出具体的实现腐蚀和膨胀的函数代码:////////////////////////////////二值图像腐蚀操作函数BOOL ImageErosion(BYTE *pData,int Width,int Height){//pData为图像数据的指针,Width和Height为图像的宽和高;BYTE* pData1;int m,n,i,j,sum,k,sum1;BOOL bErosion;if(pData==NULL){AfxMessageBox("图像数据为空,请读取图像数据");return FALSE;}//申请空间,pData1存放处理后的数据;pData1=(BYTE*)new char[WIDTHBYTES(Width*8)*Height];if(pData1==NULL){AfxMessageBox("图像缓冲数据区申请失败,请重新申请图像数据缓冲区");return FALSE ;}memcpy(pData1,pData,WIDTHBYTES(Width*8)*Height);for(i=10;i<Height-10;i++)for(j=32;j<Width-32;j++){bErosion=FALSE;sum=*(pData+WIDTHBYTES(Width*8)*i+j);if(sum==255){//求像素点八邻域的灰度均值;for(m=-1;m<2;m++){for(n=-1;n<2;n++){sum1=*(pData+WIDTHBYTES(Width*8)*(i+m)+j+n);if(sum1==0){*(pData1+WIDTHBYTES(Width*8)*i+j)=0;bErosion=TRUE;break;}}if(bErosion){bErosion=FALSE;break;}}}}memcpy(pData,pData1,WIDTHBYTES(Width*8)*Height); return TRUE;}////////////////////////////////////二值图像的膨胀操作BOOL ImageDilation(BYTE *pData,int Width,int Height){BYTE* pData1;int m,n,i,j,sum,k,sum1;BOOL bDilation;if(pData==NULL){AfxMessageBox("图像数据为空,请读取图像数据");return FALSE;}//申请空间,pData1存放处理后的数据;pData1=(BYTE*)new char[WIDTHBYTES(Width*8)*Height];if(pData1==NULL){AfxMessageBox("图像缓冲数据区申请失败,请重新申请图像数据缓冲区");return FALSE ;}memcpy(pData1,pData,WIDTHBYTES(Width*8)*Height);for(i=10;i<Height-10;i++)for(j=32;j<Width-32;j++){bDilation=FALSE;sum=*(pData+WIDTHBYTES(Width*8)*i+j);if(sum==0){//求像素点八邻域的灰度值;for(m=-1;m<2;m++){for(n=-1;n<2;n++){sum1=*(pData+WIDTHBYTES(Width*8)*(i+m)+j+n);if(sum1==255){*(pData1+WIDTHBYTES(Width*8)*i+j)=255;bDilation=TRUE;break;}}if(bDilation){bDilation=FALSE;break;}}}}memcpy(pData,pData1,WIDTHBYTES(Width*8)*Height);return TRUE;}从上面的说明可以看出,腐蚀可以消除图像中小的噪声区域,膨胀可以填补物体中的空洞。
图像的腐蚀和膨胀研究背景和意义依据数学形态学集合论方法发展起来的图像处理方法,在数字图像处理和机器视觉领域中得到了广泛的应用,形成了一种独特的数字图像分析和理论。
数学形态学是图像处理和模式识别领域的新方法,其基本的思想是:用具有一定形态的结构元素去度量和提取图像中的对应形状,已达到图像分析和识别的目的。
优势有一下几点:有效滤除噪声,保留图像中原有信息,算法很容易用并行处理方法有效实现,基于数学形态学的边缘信息提取处理优于基于微分运算的边缘提取算法,提取的边缘比较平滑,提取的图像骨架也比较连续,断点很少。
二.原理特殊领域运算形式——结构元素,在每个像素位置上与二值图像对应的区域进行特定的逻辑运算。
运算结果是输出图像的相应像素。
运算效果取决于结构元素大小、内容以及逻辑运算性质。
结构元素:膨胀和腐蚀操作的最基本组成部分,用于测试输出图像,通常要比待处理的图像小的多。
二维平面结构元素由一个数值为0或1的矩阵组成。
结构元素的原点(锚点)指定了图像中需要处理的像素范围,结构元素中数值为1的点决定结构元素的领域像素在进行膨胀或腐蚀操作时是否需要参与计算。
常见的形态学运算有腐蚀和膨胀两种:腐蚀:删除对象边缘某些像素。
膨胀:给图像中的对象边缘添加像素。
三.算法及效果图膨胀算法:用3X3的结构元素扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作,如果都为0,结果图像的该像素点为0,否则为1。
膨胀算法的效果是使二值图像扩大一圈。
腐蚀的算法:用3X3的结构元素,扫描图像的每一个像素点,用结构元素与其覆盖的二值图像做“与”操作,如果结果都为1,结果图像的该像素点为1,否则为0。
膨胀算法的结果:是二值图像减少一圈。
四.组合使用效果先腐蚀后膨胀的过程:利用它可以消除小物体,在纤细点处分离物体,平滑较大物体边界,但同时并不会明显改变原来物体的面积。
先膨胀后腐蚀的过程:利用它可以填充物体内细小空洞,连接临近物体、平滑其边界,但同时并不会明显改变原来物体的面积。
《OpenCV图像处理》---上机实验报告 31.实验题目:腐蚀与膨胀操作2.实验目的:(1)如何使用opencv提供的两种最基本的形态学操作,腐蚀与膨胀;(2)掌握opencv运行环境及腐蚀与膨胀的基本运行过程。
3.实验原理:(1)形态学操作:形态学操作就是基于形状的一系列图像处理操作,通过将结构元素作用于输入图像来产生输出图像。
基本的形态学操作有腐蚀与膨胀,他们的应运广泛:消除噪声,分割独立的图像元素,以及连接相邻的元素;寻找图像中明显的极大值区域或极小值区域。
(2)膨胀:此操作将图像A与任意形状的内核(B),通常为正方形或圆形,进行卷积;内核有一个可定义的锚点,通常定义为内核中心点;进行膨胀操作时,将内核B画过图像,将内核B覆盖区域的最大像素值提取,并代替锚点位置的像素。
显然这一最大化操作会导致图像中的亮区开始“扩展”。
(3)腐蚀:它在形态学操作家族里是膨胀操作的孪生姐妹。
它提取的是内核覆盖下的像素最小值;进行腐蚀操作时,将内核B画过图像,将内核B覆盖区域的最小像素值提取,并代替锚点位置像素,腐蚀操作的结果是图片亮区变细,黑色区域变大。
4.实验结果:5.源程序:#include<stdafx.h>#include<opencv2/imgproc/imgproc.hpp> #include<opencv2/highgui/highgui.hpp> #include<highgui.h>#include<stdlib.h>#include<stdio.h>using namespace std;using namespace cv;Mat src,erosion_dst,dilation_dst;int erosion_elem=0;int erosion_size=0;int dilation_elem=0;int dilation_size=0;int const max_elem=2;int const max_kernel_size=21;void Erosion(int ,void*);void Dilation(int ,void*);int main(int argc,char** argv){src=imread("na.jpg");if(!src.data){return -1;}namedWindow("Erosion Demo", CV_WINDOW_AUTOSIZE );namedWindow("Dilation Demo", CV_WINDOW_AUTOSIZE );cvMoveWindow("Dilation Demo",src.cols,0);createTrackbar("Element:\n0:Rect\n1:Cross\n2:Ellipse","E rosion Demo",&erosion_elem,max_elem,Erosion);createTrackbar("Kernel size:\n 2n +1","Erosion Demo", &erosion_size,max_kernel_size,Erosion);createTrackbar("Element:\n0:Rect\n1:Cross\n2:Ellipse","Dila tion Demo",&dilation_elem,max_elem,Dilation);createTrackbar("Kernel size:\n 2n +1","Dilation Demo",&dilation_size,max_kernel_size,Dilation);Erosion(0,0);Dilation(0,0);waitKey(0);return 0;}void Erosion(int,void*){int erosion_type;if(erosion_elem==0){erosion_type=MORPH_RECT;}else if(erosion_elem==1){erosion_type=MORPH_CROSS;}else if(erosion_elem==2){erosion_type=MORPH_ELLIPSE;} Matelement=getStructuringElement(erosion_type,Size(2*erosion_s ize+1,2*erosion_size+1),Point(erosion_size,erosion_size));erode(src,erosion_dst,element);imshow("Eerosion Demo",erosion_dst);}void Dilation(int,void*){int dilation_type;if(dilation_elem==0){dilation_type=MORPH_RECT;}else if(dilation_elem==1){dilation_type=MORPH_CROSS;} else if(dilation_elem==2){dilation_type=MORPH_ELLIPSE;} Matelement=getStructuringElement(dilation_type,Size(2*dilation _size+1,2*dilation_size+1),Point(dilation_size,dilation_size));erode(src,dilation_dst,element);imshow("Dilation Demo",dilation_dst);}实验总结:通过本次实验,我再一次学到了一种图像处理的方法,了解并使用OpenCV提供的两种最基本的形态学操作,腐蚀与膨胀及腐蚀和膨胀的基本原理,学习对输入的图片进行腐蚀(Erosion)和膨胀(Dilation)操作,我熟悉了对图片的腐蚀与膨胀的的操作和具体代码,写代码期间遇到过很多问题,通过查阅书籍和资料都一一改正了过来,总之,代码还是不太熟悉,还有待于进一步提高。
形态学运算中腐蚀,膨胀,开运算和闭运算(针对二值图而言)6.1腐蚀腐蚀是一种消除边界点,使边界向内部收缩的过程。
可以用来消除小且无意义的物体。
腐蚀的算法:用3x3的结构元素,扫描图像的每一个像素用结构元素与其覆盖的二值图像做“与”操作如果都为1,结果图像的该像素为1。
否则为0。
结果:使二值图像减小一圈把结构元素B平移a后得到Ba,若Ba包含于X,我们记下这个a点,所有满足上述条件的a点组成的集合称做X被B腐蚀(Erosion)的结果。
用公式表示为:E(X)={alBa C X}=X©B,如图6.8所示。
图6.8腐蚀的示意图图6.8中X是被处理的对象,B是结构元素。
不难知道,对于任意一个在阴影部分的点a,Ba包含于X,所以X被B腐蚀的结果就是那个阴影部分。
阴影部分在X的范围之内,且比X小,就象X被剥掉了一层似的,这就是为什么叫腐蚀的原因。
值得注意的是,上面的B是对称的,即B的对称集Bv=B,所以X被B腐蚀的结果和X被Bv腐蚀的结果是一样的。
如果B不是对称的,让我们看看图6.9,就会发现X被B腐蚀的结果和X被Bv腐蚀的结果不同。
y图6.9结构元素非对称时,腐蚀的结果不同图6.8和图6.9都是示意图,让我们来看看实际上是怎样进行腐蚀运算的。
在图6.10中,左边是被处理的图象X (二值图象,我们针对的是黑点),中间是结构元素B ,那个标有origin 的点是中心点,即当前处理元素的位置,我们在介绍模板操作时也有过类似的概念。
腐蚀的方法是,拿B 的中心点和X 上的点一个一个地对比,如果B 上的所有点都在X 的范围内,则该点保留,否则将该点去掉;右边是腐蚀后的结果。
可以看出,它仍在原来X 的范围内,且比X 包含的点要少,就象X 被腐蚀掉了一层。
o Q Q Q o & QO Qo Q o O oooo o o o o o 0- 0 O 0 o o •• • ■ Oo o oo o o 0 o o o o o 0 0 o o o ••o o o oo o o o ■ ■ o o 0 0 o o o ••o 0 0 oo o o 0 ■ • ♦ o QQ Q ■0 0 & o Q Q Q 0 0 * * 0 0 0 O 0 0 • ♦ ♦■ 0 Q Q ◎ 00o o ■ •0 0 o O ■ ■ ■ ■ *« O Q Qo o■ ■ ■ ■ Q Q c- O■ * ■ o GO O O O o o •o o ■ •• ■ o o o o O oO ■ ■ ■o 0o O O o O ♦<Q 0■••■ o a o o O o O o o 0 0 o 0oO o oooo\>o0 00o o o o 0 0 0'originFEX e 6图6.10腐蚀运算 图6.11为原图,图6.12为腐蚀后的结果图,能够很明显地看出腐蚀的效果。
腐蚀膨胀算法原理
腐蚀膨胀算法(Erosion-DilationAlgorithm,缩写为EDA)是图像处理中最常用的算法之一。
它主要应用于图像的二值化处理,可以有效地消除图像中的噪声,以及实现图像中文字和物体的分割。
EDA是一种分水岭算法(Watershed Algorithm),该算法包括两个步骤,腐蚀和膨胀。
腐蚀步骤将从图像中提取图像对象的轮廓,而膨胀步骤将对象的轮廓填充,从而实现对图像对象的分割。
一般来说,EDA算法可以分为以下两步:
(1)腐蚀:腐蚀是图像处理中常用的技术,它的目的是去除图像中的噪声,消除图像中的噪点,并实现对图像中的文字或物体的轮廓提取。
腐蚀的基本原理是:使用一个结构元素(structuring element),它可以是不同类型的形状,如圆形、菱形、矩形等,将图像中某像素的非零元素替换为零。
(2)膨胀:膨胀是EDA算法中另一个重要的步骤,它是腐蚀的反向过程。
膨胀的基本原理是:使用一个结构元素将图像中某像素的零元素替换为非零元素,如果临近的像素是非零元素,则认为此像素属于某个对象的轮廓。
EDA算法的优点在于它既可以去除噪声,又可以实现文字或物体的分割。
此外,EDA算法还性能卓越,比一般算法要快得多,是图像处理中用到较多的算法之一。
但EDA算法也存在缺点:结构元素的选择不当,会影响到最终的结果;由于腐蚀操作的迭代,会导致目标图像的误差及失真问题;同
样,膨胀操作也会null影响图像的体积及精度。
总而言之,腐蚀膨胀算法是一种有效的图像处理算法,在图像的噪声消除、文字分割等应用中均有良好的效果,但也有一定的缺点,应该合理选择结构元素,以保证算法的正确性和最佳效果。
一.形态学基础知识理解形态学图像处理基本的运算包括:二值腐蚀和膨胀、二值开闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换、灰值腐蚀和膨胀、灰值开闭运算、灰值形态学梯度等。
1.膨胀与腐蚀最基本的形态学操作有二种:膨胀与腐蚀(Dilation与Erosion)。
膨胀是在二值图像中“加长”和“变粗”的操作。
这种方式和变粗的程度由一个结构元素组成的集合来控制。
腐蚀是“收缩”或“细化”二值图像中的对象。
同样,收缩的方式和程度由一个结构元素控制。
腐蚀和膨胀是对白色部分(高亮部分)而言的,不是黑色部分。
膨胀就是图像中的高亮部分进行膨胀,“领域扩张”,效果图拥有比原图更大的高亮区域。
腐蚀就是原图中的高亮部分被腐蚀,“领域被蚕食”,效果图拥有比原图更小的高亮区域。
常用的三种膨胀与腐蚀的组合:开运算、闭运算、击中或击不中变换。
(1)开运算和闭运算: A被B的形态学开运算是A被B腐蚀后再用B来膨胀腐蚀结果。
其几何解释为:B在A内完全匹配的平移的并集。
形态学开运算完全删除了不能包含结构元素的对象区域,平滑了对象的轮廓,断开了狭窄的连接,去掉了细小的突出部分;(2)闭运算: A被B的形态学闭运算是先膨胀再腐蚀的结果,其几何解释为:所有不与A重叠的B的平移的并集。
形态学闭运算会平滑对象的轮廓,与开运算不同的是,闭运算一般会将狭窄的缺口连接起来形成细长的弯口,并填充比结构元素小的洞。
(3)击中击不中变换: 击中与击不中变换先对目标图像进行目标结构元素的腐蚀操作;后对目标图像的对偶进行背景结构元素的腐蚀操作;最后取两次结果的交集。
2.重构重构是一种涉及到两幅图像和一个结构元素的形态学变换。
一幅图像,即标记(marker),是变换的开始点。
另一幅图像是掩模(mask),用来约束变换过程。
结构元素用于定义连接性。
3.灰度图像形态学对于灰度图像来说,膨胀和腐蚀是以像素邻域的最大值和最小值来定义的。
1实验目的选取一张自己的生活照,实现:任选两种结构对图像进行腐蚀和膨胀。
边缘检测(分别使用Prewitt,两种大小的Sobel算子,不同参数的Canny算子,LoG算子),并对比各个算子实现差异及不同参数条件下的实验效果。
2实验过程2.1图像腐蚀和膨胀实验图片所用代码import cv2import numpy as npdef threshold(image, threshold):out = image.copy()out[out < threshold] = 0out[out > threshold] = 1out = out.astype(np.uint8)return out# 1. 读取图像文件image = cv2.imread('img/in.jpeg', cv2.IMREAD_GRAYSCALE)# 2. 缩放图像print('Shape: {}'.format(image.shape))image = cv2.resize(image, (256, 256), cv2.INTER_LINEAR)print('Shape: {}'.format(image.shape))# 3. 均一阈值分割binary = threshold(image, threshold=200)# 4. 腐蚀kernel_size = 5erode = cv2.erode(binary, kernel=np.ones((kernel_size, kernel_size)))# 5. 膨胀dilate = cv2.dilate(binary, kernel=np.ones((kernel_size, kernel_size)))# 6. 显示图像cv2.imshow('Image', image)cv2.imshow('Binary', binary * 255)cv2.imshow('Erode', erode * 255)cv2.imshow('Dilate', dilate * 255) cv2.waitKey(0)实验效果Kernel=5Kernel=25代码分析及现象腐蚀,消除连通的边界,使边界向内收缩。
【二值形态学膨胀、腐蚀、开、闭运算opencv的深度解析】一、概念介绍1. 二值形态学在图像处理中,二值形态学是一种针对二值图像进行的形态学操作,主要包括膨胀、腐蚀、开、闭运算等。
2. 膨胀膨胀是二值形态学中的一种基本操作,它能够使目标区域扩张并填充内部的空洞,从而使目标变大。
3. 腐蚀腐蚀是二值形态学中的另一种基本操作,它能够使目标区域收缩并去除边缘细节,从而使目标变小。
4. 开运算开运算是先腐蚀后膨胀的组合操作,可以用来去除图像中的噪声和小的干扰目标。
5. 闭运算闭运算是先膨胀后腐蚀的组合操作,可以用来填补图像中的小孔和裂缝。
二、深入探讨1. 膨胀的原理和作用膨胀通过结构元素的滑动来扩张目标区域,可以使目标变大,填充空洞,连接断裂的目标,是图像处理中常用的操作之一。
2. 腐蚀的原理和作用腐蚀通过结构元素的滑动来收缩目标区域,可以使目标变小,去除边缘细节,分离接触的目标,也是图像处理中常用的操作之一。
3. 开闭运算的应用场景开运算通常用于去除图像中的小噪声和杂点,可以平滑目标轮廓,提高目标边缘的连通性;闭运算通常用于填补图像中的小孔和断裂,可以使目标更加完整,减少断裂和裂缝。
4. opencv中的二值形态学函数opencv提供了丰富的二值形态学函数,可以方便地进行膨胀、腐蚀、开、闭运算,如cv2.dilate()、cv2.erode()、cv2.morphologyEx()等,可以通过设置结构元素的形状和大小来调整操作效果。
5. 个人观点和理解对于二值形态学操作,我认为膨胀和腐蚀是其基础,而开闭运算则是在这两者基础上的进一步应用,能够更加精细地处理目标区域,去除干扰和噪声,提取有效信息。
在实际应用中,需要根据具体情况选择不同的操作和参数,以达到最佳的处理效果。
三、总结回顾通过本文的介绍和分析,我们深入理解了二值形态学中的膨胀、腐蚀、开、闭运算的原理和作用,以及在opencv中的应用方式。
我们也从个人观点出发,探讨了这些操作的实际意义和效果。
基于Matlab的腐蚀和膨胀的边缘检测一、实验目的:掌握运用Matlab软件对灰度与二值图像的膨胀与腐蚀的处理方法。
二、实验环境(软件条件):Windws2000/XP MATLAB 7.x三、实验内容:1、图像膨胀的Matlab实现①实验原理:膨胀:给图像中的对象边界添加像素。
在操作中,输出图像中所有给定像素的状态都是通过对输入图像的相应像素及邻域使用一定的规则进行确定。
在膨胀操作时,输出像素值是输入图像相应像素邻域内所有像素的最大值。
在二进制图像中,如果任何像素值为1,那么对应的输出像素值为1。
可以使用imdilate函数进行图像膨胀,imdilate函数需要两个基本输入参数,即待处理的输入图像和结构元素对象。
结构元素对象可以是strel函数返回的对象,也可以是一个自己定义的表示结构元素邻域的二进制矩阵。
此外,imdilate还可以接受两个可选参数:PADOPT(padopt) ——影响输出图片的大小、PACKOPT (packopt).——说明输入图像是否为打包的二值图像(二进制图像)。
②实验步骤:A、首先创建一个包含矩形对象的二值图像矩阵。
R=zeros(9,10);R(4:6,4:7) =1R =0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 1 1 1 1 0 0 00 0 0 1 1 1 1 0 0 00 0 0 1 1 1 1 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0B、使用一个3×3的正方形结构元素对象对创建的图像进行膨胀。
C=strel('square',3)C =Flat STREL object containing 9 neighbors. Neighborhood:1 1 11 1 11 1 1C、将图像R和结构元素C传递给imdilate函数。