數學形態學的基本思想是用具有一定形態的結構元素去度量和提取圖像中的對應形狀以達到對圖像分析和識別的目的。數學形態學的基本運算有四個:腐蝕、膨脹、開和閉。基於這些基本運算還可以推導和組合成各種數學形態學實用算法。本實驗分別實現針對二值圖像和灰度圖像的四種形態學操作。
一、二值圖像的腐蝕、膨脹、開、閉操作
實驗結果:
二、灰度圖像的腐蝕、膨脹、開、閉操作
實驗結果:
代碼:(下載鏈接)

%本實驗完成對二值圖像和灰度圖像的腐蝕、膨脹、開、閉操作 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