1、原理
所謂的圖片的膨脹處理,其實就是在圖像的邊緣添加像素值,使得整體的像素值擴張,進而達到圖像的膨脹效果,也可以說是信號與系統書中所提到的像素插值處理。
對Z2上元素集合A和結構體元素S,使用S對A進行腐蝕,記作:
A⊕S={z|(S)z ∩ A ≠ Ø}
讓位於圖像圓點的結構元素S在Z平面上移動,如果S的圓點移動到z點時,S與A有公共的交集(非空集),則認為這樣的z點構成的集合是S對A的膨脹圖像。
下圖左側是原圖X,B是結構元素,右圖是膨脹的結果。膨脹的方法是,拿B的中心點和X上的點一個一個地對比,如果B上至少有一個點在X的范圍內,則該點為前景有效點;右邊是膨脹后的結果。可以看出,膨脹后的圖比原圖點數多,就象X被膨脹增加了一層。

2、膨脹的實現
imgPath = 'E:\opencv_pic\src_pic\pic1.bmp'; img = imread(imgPath); img=rgb2gray(img); img = 255-img; se = strel('square', 3) img2 = imdilate(img, se); subplot(1,2,1),imshow(img),title('原始圖像'); subplot(1,2,2),imshow(img2),title('膨脹圖像');
膨脹后結果如下圖。

放大后觀察,左側的噪點,第一列最下面一個是2*2的塊,膨脹后變為4*4塊。

如果使用5*5和10*10的結構元素,膨脹效果如下。
se = strel('square', 5) img2 = imdilate(img, se); subplot(1,3,1),imshow(img),title('原始圖像'); subplot(1,3,2),imshow(img2),title('膨脹圖像系數5'); se3 = strel('square', 10) img3 = imdilate(img, se3); subplot(1,3,3),imshow(img3),title('膨脹圖像系數10');
膨脹使物體的邊界擴大,可能把多個元素連同起來。腐蝕后可以刪除對象邊界的某些像素,而膨脹給圖像中的對象邊界添加像素。腐蝕使圖像變“細”,膨脹是圖像變“粗”。

先腐蝕后再膨脹可以用在圖像濾波,腐蝕后圖像變細,去除了比較小的噪聲,膨脹后恢復原圖像。
imgPath = 'E:\opencv_pic\src_pic\pic1.bmp'; img = imread(imgPath); img=rgb2gray(img); img = 255-img; se = strel('square', 5) img2 = imerode(img, se); img3 = imdilate(img2, se); subplot(1,3,1),imshow(img),title('原始圖像'); subplot(1,3,2),imshow(img2),title('腐蝕圖像'); subplot(1,3,3),imshow(img3),title('膨脹圖像');
圖像效果如下圖。

3、總結
和腐蝕相反,膨脹能使物體的邊界擴大,具體的結果和圖像的本身、結構元素的形狀有關。一般的,二值化后圖像容易出現斷裂,膨脹可以橋接斷裂的縫隙。
腐蝕和膨脹對比:
膨脹用3X3的結構元素,掃描二值圖像的每一個像素,用結構元素與其覆蓋的二值圖像做“與”運算,如果都為0,結構圖像的該像素為0,否則為1。只要有一個元素非零結果就非零,所以使二值圖像擴大一圈。
腐蝕用3X3的結構元素,掃描二值圖像的每一個像素,用結構元素與其覆蓋的二值圖像做“與”運算,如果都為1,結構圖像的該像素為1,否則為0。只要全部元素都為1結果才為1,所以使二值圖像減小一圈。
尊重原創技術文章,轉載請注明。
