形态学操作实现
Posted luo1873626242
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了形态学操作实现相关的知识,希望对你有一定的参考价值。
数学形态学的基本思想是用具有一定形态的结构元素去度量和提取图像中的对应形状以达到对图像分析和识别的目的。数学形态学的基本运算有四个:腐蚀、膨胀、开和闭。基于这些基本运算还可以推导和组合成各种数学形态学实用算法。本实验分别实现针对二值图像和灰度图像的四种形态学操作。
一、二值图像的腐蚀、膨胀、开、闭操作
实验结果:
二、灰度图像的腐蚀、膨胀、开、闭操作
实验结果:
代码:(下载链接)
%本实验完成对二值图像和灰度图像的腐蚀、膨胀、开、闭操作 close all; clear all; grayI = imread(\'rice.png\'); binI=im2bw(grayI,0.5);%转二值图 se = [0,1,0;1,1,1;0,1,0]; %结构元 binIerode = myimerode(binI,se,\'binary\'); binIdilate = myimdilate(binI,se,\'binary\'); binIopen = myimopen(binI,se,\'binary\'); binIclose = myimclose(binI,se,\'binary\'); grayIerode = myimerode(grayI,se,\'gray\'); grayIdilate= myimdilate(grayI,se,\'gray\'); grayIopen = myimopen(grayI,se,\'gray\'); grayIclose = myimclose(grayI,se,\'gray\'); figure; subplot(2,3,1);imshow(binI);title(\'原始二值图\'); subplot(2,3,2);imshow(binIerode);title(\'腐蚀结果\'); subplot(2,3,3);imshow(binIdilate);title(\'膨胀结果\'); subplot(2,3,4);imshow(binIopen);title(\'开结果\'); subplot(2,3,5);imshow(binIclose);title(\'闭结果\') figure; subplot(2,3,1);imshow(grayI);title(\'原始灰度图\'); subplot(2,3,2);imshow(uint8(grayIerode));title(\'腐蚀结果\'); subplot(2,3,3);imshow(uint8(grayIdilate));title(\'膨胀结果\'); subplot(2,3,4);imshow(uint8(grayIopen));title(\'开结果\'); subplot(2,3,5);imshow(uint8(grayIclose));title(\'闭结果\');
function O=myimclose(I,se,type) %%闭操作 %I:输入图像(二值或灰度) %se:结构元 %type:图像类型(gray、binary) %O:闭操作结果 O=myimerode(myimdilate(I,se,type),se,type);
function O=myimopen(I,se,type) %开操作 %I:输入图像(二值或灰度) %se:结构元 %type:图像类型(gray、binary) %O:开操作结果 O=myimdilate(myimerode(I,se,type),se,type);
function O=myimerode(I,se,type) %%腐蚀操作 %I:输入图像(二值或灰度) %se:结构元 %type:图像类型(gray、binary) %O:腐蚀操作结果 O=zeros(size(I)); [r,c]=size(I); [m,n]=size(se); lm=floor((m-1)/2); ln=floor((n-1)/2); rm=m-lm-1; rn=n-ln-1; orgm=lm+1;%结构元原点 orgn=ln+1; if(strcmp(type,\'binary\'))%二值图像 for i=1:r for j=1:c indexr=max(1,i-lm):min(r,i+rm);%边界处理 indexc=max(1,j-ln):min(c,j+rn); if(sum(sum(se(indexr-i+orgm,indexc-j+orgn)&I(indexr,indexc)))==sum(sum(se(indexr-i+orgm,indexc-j+orgn)))) O(i,j)=1; end end end end if(strcmp(type,\'gray\'))%灰度图像 I=double(I); for i=1:r for j=1:c indexr=max(1,i-lm):min(r,i+rm);%边界处理 indexc=max(1,j-ln):min(c,j+rn); O(i,j)=min(min(I(indexr,indexc)-se(indexr-i+orgm,indexc-j+orgn))); end end end
function O=myimdilate(I,se,type) %%膨胀操作 %I:输入图像(二值或灰度) %se:结构元 %type:图像类型(gray、binary) %O:膨胀操作结果 se=reflect(se);%结构元反射 O=zeros(size(I)); [r,c]=size(I); [m,n]=size(se); lm=floor(m/2);%区别于erode ln=floor(n/2); rm=m-lm-1; rn=n-ln-1; orgm=lm+1;%结构元原点 orgn=ln+1; if(strcmp(type,\'binary\'))%二值图像 for i=1:r for j=1:c indexr=max(1,i-lm):min(r,i+rm);%边界处理 indexc=max(1,j-ln):min(c,j+rn); if(sum(sum(se(indexr-i+orgm,indexc-j+orgn)&I(indexr,indexc)))>=1) O(i,j)=1; end end end end if(strcmp(type,\'gray\'))%灰度图像 I=double(I); for i=1:r for j=1:c indexr=max(1,i-lm):min(r,i+rm);%边界处理 indexc=max(1,j-ln):min(c,j+rn); O(i,j)=max(max(I(indexr,indexc)+se(indexr-i+orgm,indexc-j+orgn))); end end end function newse=reflect(se) %%结构元反射操作 %se:输入结构元 %newse:反射后结构元 [m,n]=size(se); newse=zeros(m,n); for i=1:m for j=1:n newse(i,j)=se(m+1-i,n+1-j); end end
以上是关于形态学操作实现的主要内容,如果未能解决你的问题,请参考以下文章
图像的形态学开操作(开运算)和闭操作(闭运算)的概念和作用,并用OpenCV的函数morphologyEx()实现对图像的开闭操作