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