数字图像处理腐蚀与膨胀小程序
《图像处理》实验8:二值图像膨胀、腐蚀

二值图像膨胀、 二值图像膨胀、腐蚀实验步骤
BYTE* TempData=new BYTE[linebytes*infoheader->biHeight]; memset(TempData,0,linebytes*infoh eader->biHeight); //开辟临时空间,存放数据 开辟临时空间, 开辟临时空间
实验八 二值图像膨胀、 二值图像膨胀、腐蚀
矿大信电学院 蔡利梅
一、实验目的
掌握二值图像膨胀、 掌握二值图像膨胀、腐蚀的基本方法 编程实现膨胀、 编程实现膨胀、腐蚀
二、实验原理
膨胀 腐蚀
二值图像膨胀、 二值图像膨胀、腐蚀实验步骤
打开应用程序Clm 打开应用程序 修改程序菜单 添加“二值图像处理”下拉菜单, 添加“二值图像处理”下拉菜单,并添加下 一级子菜单“膨胀” 一级子菜单“膨胀”,ID:ID_DILATION, : , 添加子菜单“腐蚀” 添加子菜单“腐蚀”,ID:ID_EROSION : 创建菜单项“膨胀” 腐蚀” 创建菜单项“膨胀” 、“腐蚀”的消息响 应函数OnDilation() 、OnErosion()。(基 。(基 应函数 。( 于CClmDoc类) 类
二值图像膨胀、 二值图像膨胀、腐蚀实验步骤
switch(nbtype) { case 0: nbw=1; nbh=3; break; case 1: nbw=3; nbh=1; break; case 2: nbw=3; nbh=3; break; case 3: nbw=5; nbh=5; break; }
二值图像膨胀、 二值图像膨胀、腐蚀实验步骤
BYTE* TempData=new BYTE[linebytes*infoheader->biHeight]; memset(TempData,255,linebytes*infohe ader->biHeight); //开辟临时空间,存放数据 开辟临时空间, 开辟临时空间
Python图像处理之膨胀与腐蚀的操作

Python图像处理之膨胀与腐蚀的操作引⾔膨胀与腐蚀是图像处理中两种最基本的形态学操作,膨胀将⽬标点融合到背景中,向外部扩展,腐蚀与膨胀意义相反,消除连通的边界,使边界向内收缩。
在本⽂中我们将了解使⽤内核的图像膨胀与腐蚀的基本原理。
让我们开始吧,同样我们需要导⼊必需的库。
import numpy as npimport matplotlib.pyplot as pltfrom skimage.io import imread, imshowfrom skimage.draw import circlefrom skimage.morphology import erosion, dilation⾸先让我们创建⼀个容易操作的形状--⼀个简单的圆。
circ_image = np.zeros((100, 100))circ_image[circle(50, 50, 25)] = 1imshow(circ_image);现在让我们定义⼀个内核。
cross = np.array([[0,1,0],[1,1,1],[0,1,0]])imshow(cross, cmap = 'gray');将腐蚀函数应⽤到创建的圆上。
eroded_circle = erosion(circ_image, cross)imshow(eroded_circle);图像看起来⼏乎⼀模⼀样。
要看到那些微⼩的差异,我们必须仔细查看图像。
linecolor = 'red'fig, ax = plt.subplots(1, 2, figsize=(12, 5))ax[0].imshow(circ_image, cmap = 'gray');ax[0].set_title('Original', fontsize = 19)ax[0].axvline(x = 25, color = linecolor)ax[0].axvline(x = 75, color = linecolor)ax[0].axhline(y = 25, color = linecolor)ax[0].axhline(y = 75, color = linecolor)ax[1].imshow(eroded_circle, cmap = 'gray');ax[1].set_title('Eroded', fontsize = 19)ax[1].axvline(x = 25, color = linecolor)ax[1].axvline(x = 75, color = linecolor)ax[1].axhline(y = 25, color = linecolor)ax[1].axhline(y = 75, color = linecolor)fig.tight_layout()我们可以看到,被腐蚀的圆已经略微缩⼩了。
OpenCV图像的腐蚀与膨胀

《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)操作,我熟悉了对图片的腐蚀与膨胀的的操作和具体代码,写代码期间遇到过很多问题,通过查阅书籍和资料都一一改正了过来,总之,代码还是不太熟悉,还有待于进一步提高。
腐蚀膨胀开闭运算

腐蚀膨胀开闭运算
腐蚀、膨胀、开运算和闭运算是数字图像处理中的四种基本形态学图像处理方法。
腐蚀是一种去除图像边缘部分小而不重要的形态学操作,它可以消除噪点和细小的连接。
简单说来,就是用一个小的(结构性)元素点,从图像的边缘开始向内腐蚀,去除对象的边缘。
因此,腐蚀会缩小对象的大小。
膨胀与腐蚀相反,它是一种扩大图像边缘部分的形态学操作。
膨胀可以使图像中的对象“增肥”,但同时也会扩展对象边缘的噪声区域,使对象的边缘变得更加不规则。
开运算是先进行腐蚀,再进行膨胀的操作,通常这种操作可以去除细小的对象以及噪点。
开运算可以通过一些形态学方法获得更加光滑和整齐的对象,减少边缘的锯齿状现象。
闭运算是先进行膨胀,再进行腐蚀的操作。
闭运算可以消除图像对象中的小孔洞,埋没较小的断裂和连接对象之间的空隙。
通常情况下,闭运算会使对象的大小增加,边缘变得更加光滑和整齐。
北航数图实验报告四 图像腐蚀和膨胀

北京航空航天大学数字图像处理实验报告实验四:图像分割处理学院专业方向班级学号学生姓名指导教师实验四图像分割处理实验1.实验目的(1)了解图像分割的基本原理,并利用图像分割算法进行图像分割处理;(2)掌握数学形态学的基本运算。
2.实验内容(1)利用类间方差阈值算法实现图像的分割处理;(2)利用形态学处理进行处理结果修正。
3. 实验要求(1)实验用图:(2)对输入图像进行平滑处理,以减小噪声对分割处理的影响;(3)利用类间方差阈值算法对滤波处理后图像进行分割处理,获取分割图像;(4)利用数学形态学中的腐蚀和膨胀运算处理,剔除分割处理结果中的一些细小的残余误分割点,在进行腐蚀和膨胀运算时可采用半径为r的圆形结构元素,注意比较选取不同r值时的处理结果。
四、实验代码function STshiyan4_OpeningFcn(hObject, eventdata, handles, varargin) I=imread('4.bmp');I=rgb2gray(I);subplot(3,3,1);imshow(I);title('原图像');IM=medfilt2(I);%中值滤波subplot(3,3,2);imshow(IM);title('中值滤波后图像');function pushbutton1_Callback(hObject, eventdata, handles)I1=imread('4.bmp');I1=rgb2gray(I1);T=Otsu(I1);IM1=medfilt2(I1);s=size(IM1);for m=1:s(1)for n=1:s(2)if IM1(m,n)>=TIM1(m,n)=255;elseIM1(m,n)=0;endendendsubplot(3,3,3);imshow(IM1);title('最大类间方差法');function pushbutton2_Callback(hObject, eventdata, handles) I = imread('4.bmp');%--------------r=1腐蚀--------------------------se1 = strel('disk',1,8);I1 = imerode(I,se1);subplot(3,3,4);imshow(I1);title('r=1的腐蚀运算');%--------------r=2腐蚀--------------------------se2 = strel('disk',2,8);I2 = imerode(I,se2);subplot(3,3,5);imshow(I2);title('r=2的腐蚀运算');%--------------r=3腐蚀--------------------------se3 = strel('disk',3,8);I3 = imerode(I,se3);subplot(3,3,6);imshow(I3);title('r=3的腐蚀运算');function pushbutton3_Callback(hObject, eventdata, handles) I = imread('4.bmp');%--------------r=1膨胀--------------------------se1 = strel('disk',1,8);I1 = imdilate(I,se1);subplot(3,3,7);imshow(I1);title('r=1的膨胀运算');%--------------r=2膨胀--------------------------se2 = strel('disk',2,8);I2 = imdilate(I,se2);subplot(3,3,8);imshow(I2);title('r=2的膨胀运算');%--------------r=3膨胀--------------------------se3 = strel('disk',3,8);I3 = imdilate(I,se3);subplot(3,3,9);imshow(I3);title('r=3的膨胀运算');五、实验结果程序运行后,进入到GUI页面,选择相应的按钮就可以显示相应的变换图像结果,如下:。
腐蚀膨胀算法详细解释

形态学运算中腐蚀,膨胀,开运算和闭运算(针对二值图而言)6.1 腐蚀腐蚀是一种消除边界点,使边界向内部收缩的过程。
可以用来消除小且无意义的物体。
腐蚀的算法:用3x3的结构元素,扫描图像的每一个像素用结构元素与其覆盖的二值图像做“与”操作如果都为1,结果图像的该像素为1。
否则为0。
结果:使二值图像减小一圈把结构元素B平移a后得到Ba,若Ba包含于X,我们记下这个a点,所有满足上述条件的a点组成的集合称做X被B腐蚀(Erosion)的结果。
用公式表示为:E(X)={a| Ba 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腐蚀的结果不同。
图6.9 结构元素非对称时,腐蚀的结果不同图6.8和图6.9都是示意图,让我们来看看实际上是怎样进行腐蚀运算的。
在图6.10中,左边是被处理的图象X(二值图象,我们针对的是黑点),中间是结构元素B,那个标有origin的点是中心点,即当前处理元素的位置,我们在介绍模板操作时也有过类似的概念。
腐蚀的方法是,拿B的中心点和X上的点一个一个地对比,如果B上的所有点都在X的范围内,则该点保留,否则将该点去掉;右边是腐蚀后的结果。
可以看出,它仍在原来X的范围内,且比X包含的点要少,就象X被腐蚀掉了一层。
图6.10 腐蚀运算图6.11为原图,图6.12为腐蚀后的结果图,能够很明显地看出腐蚀的效果。
图6.11 原图图6.12 腐蚀后的结果图下面的这段程序,实现了上述的腐蚀运算,针对的都是黑色点。
Python图像处理:图像腐蚀与图像膨胀

Python图像处理:图像腐蚀与图像膨胀图像的膨胀(Dilation)和腐蚀(Erosion)是两种基本的形态学运算,主要⽤来寻找图像中的极⼤区域和极⼩区域。
其中膨胀类似于“领域扩张”,将图像中的⾼亮区域或⽩⾊部分进⾏扩张,其运⾏结果图⽐原图的⾼亮区域更⼤;腐蚀类似于“领域被蚕⾷”,将图像中的⾼亮区域或⽩⾊部分进⾏缩减细化,其运⾏结果图⽐原图的⾼亮区域更⼩。
1.图像膨胀膨胀的运算符是“⊕”,其定义如下:该公式表⽰⽤B来对图像A进⾏膨胀处理,其中B是⼀个卷积模板或卷积核,其形状可以为正⽅形或圆形,通过模板B与图像A进⾏卷积计算,扫描图像中的每⼀个像素点,⽤模板元素与⼆值图像元素做“与”运算,如果都为0,那么⽬标像素点为0,否则为1。
从⽽计算B覆盖区域的像素点最⼤值,并⽤该值替换参考点的像素值实现膨胀。
下图是将左边的原始图像A膨胀处理为右边的效果图A⊕B。
2.图像腐蚀腐蚀的运算符是“-”,其定义如下:该公式表⽰图像A⽤卷积模板B来进⾏腐蚀处理,通过模板B与图像A进⾏卷积计算,得出B覆盖区域的像素点最⼩值,并⽤这个最⼩值来替代参考点的像素值。
如图所⽰,将左边的原始图像A腐蚀处理为右边的效果图A-B。
处理结果如下图所⽰:⼆. 图像腐蚀代码实现1.基础理论形态学转换主要针对的是⼆值图像(0或1)。
图像腐蚀类似于“领域被蚕⾷”,将图像中的⾼亮区域或⽩⾊部分进⾏缩减细化,其运⾏结果图⽐原图的⾼亮区域更⼩。
其主要包括两个输⼊对象:(1)⼆值图像(2)卷积核卷积核是腐蚀中的关键数组,采⽤numpy库可以⽣成。
卷积核的中⼼点逐个像素扫描原始图像,如下图所⽰:被扫描到的原始图像中的像素点,只有当卷积核对应的元素值均为1时,其值才为1,否则其值修改为0。
换句话说,遍历到的黄⾊点位置,其周围全部是⽩⾊,保留⽩⾊,否则变为⿊⾊,图像腐蚀变⼩。
2.函数原型图像腐蚀主要使⽤的函数为erode,其原型如下:dst = cv2.erode(src, kernel, iterations)参数dst表⽰处理的结果,src表⽰原图像,kernel表⽰卷积核,iterations表⽰迭代次数。
计算机视觉实验报告-对图像进行腐蚀和膨胀

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代码分析及现象腐蚀,消除连通的边界,使边界向内收缩。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
%%%%%%%%%%%%%%%%下面为用于处理的样本‘圆’%%%%%%%%%%%%%%%%%%%%%%%%%
R=8;%%半径R
S=zeros(2*R);
for x1=-R:R-1;
for y1=-R:R-1;
if round(sqrt(x1^2+y1^2))<=R%%圆心在原点的圆的表达函数
%%对圆心在原点的圆进行平移,使x,y都为非负数
x=R+x1+1;
y=R+y1+1;
S(x,y)=1;
end
end
end
figure(1),imshow(S); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%下面为要处理的图形%%%%%%%%%%%%%%%%%%%%%%%%%
W=256;L=512; %%定义边界
X=zeros(W,L);
for i=1:128
for j=1:256
if i<=15|i>=114
if j<103|j>153
X(i+W/4,j+L/4)=1;
end
else if (i>15&i<=56)|(i>=72&i<114)
if (j>50&j<103)|j>153
X(i+W/4,j+L/4)=1;
end
else if i>56&i<72
if j>50&j<206
X(i+W/4,j+L/4)=1;
end
end
end
end
end
end
figure(2),imshow(X); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%下面用S对X进行腐蚀操
作%%%%%%%%%%%%%%%%%%%%%%%%
X1=zeros(W,L);%X1用于存放处理后的图像
M=zeros(2*R);
for m=0:W-2*R
for n=0:L-2*R
%%下面用S对X区域进行‘与’操作%%
for i=1:2*R
for j=1:2*R
M(i,j)=X(i+m,j+n)&S(i,j);
end
end
if M==S %%判断S是否处于X中,等则在S中
X1(m+R,n+R)=1;
end
M=zeros(2*R);
end
end
figure(3),imshow(X1); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%下面用S对X1进行膨胀操作%%%%%%%%%%%%%%%%%%%%%%%%%%
X2=zeros(W,L);%X2用于存放处理后的图像
cnt=0;
for m=0:W-2*R
for n=0:L-2*R
%%下面用S对X区域进行‘与’操作%%
for i=1:2*R
for j=1:2*R
if X1(i+m,j+n)&S(i,j)==1 %%判断S是否与X相交
cnt=1;
break;
end
end
if cnt==1 %%判断是否是由于cnt=1而跳出循环
break;
end
end
if cnt==1 %%判断是否是由于cnt=1而跳出循环
X2(m+R,n+R)=1;
cnt=0; %%将cnt的值置0
end
end
end
figure(4),imshow(X2); ( S )
( X )
( X1 )
( X2 )。