顧名思義,條件膨脹是帶有限定條件的膨脹。限定條件通常有兩個。
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;endfigure;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; endfor 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 endendfigure;imshow(imgn,[]);