matlab練習程序(條件膨脹)


顧名思義,條件膨脹是帶有限定條件的膨脹。限定條件通常有兩個。

1.膨脹始終在原始集合內。如下圖:

原始集合圖像:

集合內部的子集圖像:

如果對后一個圖進行規則1的條件膨脹,那么最后的結果就會得到第一幅圖。所以這里第一幅圖即是原始集合圖像又是最終條件膨脹圖像。

2.膨脹之后各自粒子互不連接。如下圖:

原圖:

按規則2條件膨脹需首先標記連通區域:

然后再進行互補侵犯的膨脹:

根據具體應用環境,可以使用單一的條件或兩個條件同時使用。

分水嶺分割的最后築壩那一步就是兩個條件同時使用到了。

單獨規則1的matlab代碼:

clear all;
close all;
clc;

mask=imread('p1.jpg');
mask=mask>128;

img=imread('p2.jpg');
img=img>128;            

[m n]=size(img);
imgn=zeros(m,n);
preimg=imgn;
while sum(sum(preimg-img))~=0
    preimg=img;
    
    for i=2:m-1
        for j=2:n-1
            if mask(i,j)==1     %在模板限定的范圍之內膨脹,即為條件膨脹
                imgn(i,j)=max(max(img(i-1:i+1,j-1:j+1)));
            end
        end
    end
    img=imgn;

end

figure;
imshow(img,[]);

單獨規則2的matlab代碼:

clear all;
close all;
clc;

img=imread('l1.jpg');
img=img>128;            %二值化圖像

img=liantong(img);      %連通標記,實現見先前的博文
[m n]=size(img);
imshow(img,[])

imgn=zeros(m,n);
preimg=imgn;
while sum(sum(preimg-img))~=0   %判斷是否完全膨脹完
    preimg=img;
    
    for i=2:m-1
        for j=2:n-1
            if img(i,j)==0      %只對背景膨脹。
                flag=0;         %3*3區域是否含有兩部分的標記變量,0為有一個前景一個背景,1為有多個前景一個背景 
                tmp=img(i-1:i+1,j-1:j+1);   %3*3區域
                ma=max(tmp(:));
                mi=min(tmp(:));
                for k=1:9           %判斷3*3區域中是否含有兩部分區域,如果有,則當前像素不再膨脹
                   if tmp(k)~=ma && tmp(k)~=mi;
                       flag=1;
                       break;
                   end
                end
                
                if flag==0          %有一個前景一個背景情況正常膨脹,否則不膨脹。不膨脹也就是築壩了
                    imgn(i,j)=ma;
                end
                
            end
        end
    end
    
    img=imgn;  
end


for i=2:m-1         %將區塊邊緣的黑像素去掉
   for j=2:n-1 
       if img(i,j)==0
            imgn(i,j)=max(max(img(i-1:i+1,j-1:j+1)));
       end
   end
end

figure;
imshow(imgn,[]);

 


免責聲明!

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



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