形態學操作實現


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

一、二值圖像的腐蝕、膨脹、開、閉操作

實驗結果:

二、灰度圖像的腐蝕、膨脹、開、閉操作

實驗結果:

代碼:(下載鏈接)

%本實驗完成對二值圖像和灰度圖像的腐蝕、膨脹、開、閉操作
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('閉結果');
 
View Code
function O=myimclose(I,se,type)
%%閉操作
%I:輸入圖像(二值或灰度)
%se:結構元
%type:圖像類型(gray、binary)
%O:閉操作結果
O=myimerode(myimdilate(I,se,type),se,type);
View Code
function O=myimopen(I,se,type)
%開操作
%I:輸入圖像(二值或灰度)
%se:結構元
%type:圖像類型(gray、binary)
%O:開操作結果
O=myimdilate(myimerode(I,se,type),se,type);
View Code
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
View Code
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
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM