1、二值圖像邊界提取、輪廓提取
如果一個點的8鄰域都是1,則可以認為這個點是內部的點而不是邊界上的點,可以刪除這類點,剩下的就是邊界上的點。根據腐蝕的特性,使用3*3的結構元素對圖像進行腐蝕,可以得到內部的點,那么再用原圖減去腐蝕圖,就得到了圖像的邊界。
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); subplot(1,3,1),imshow(255-img),title('原始圖像'); subplot(1,3,2),imshow(255-img2),title('腐蝕圖像'); subplot(1,3,3),imshow(255-(img-img2)),title('邊界點');
2、形態學方法圖像區域填充
區域填充可以認為是邊界提取的反過程,已知邊界情況下得到邊界包含的區域。
已知某一圖形,具有8連通邊界,其內部有空白區域,那么怎么填充內部?
在圖像內部確認一點,然后以此點為基准,循環膨脹,只要控制住膨脹后的圖沒有超過邊界即可。
初始化:B0=種子點
循環膨脹: Do: Bi+1 = (Bi ⊕ S) ∩ Ac; Until Bi+1 = Bi 。
使用S對圖像B0進行膨脹,如果膨脹后的圖超過了邊界,則與圖像A的補集Ac 做與運算,把膨脹后的圖限制在圖像A內部。隨着B的膨脹,B的區域不斷的增長,但是每次增長后的圖像都被限制在圖像A的內部,所以最終必定填充滿圖像A,此時停止生長。
a)原始圖像
b)讀取圖像A以及補集Ac
imgPath = 'E:\opencv_pic\src_pic\pic1-1.bmp'; img1 = imread(imgPath); % 前景圖 img0 = 255-img1; % 取反景圖 subplot(1,2,1),imshow(img1),title('原始圖像'); subplot(1,2,2),imshow(img0),title('補集圖像');
c)圖像膨脹
figure; [m,n]= size(img0); B0 = zeros(m,n); B0(50, 150) = 1; se = [0 1 0;1 1 1;0 1 0]; B1=imdilate(B0, se) & img1; B2=imdilate(B1, se) & img1; subplot(1,3,1),imshow(B0),title('結構元素se'); subplot(1,3,2),imshow(B1),title('腐蝕B1'); subplot(1,3,3),imshow(B2),title('腐蝕B2');
放大后觀察,B0是單個像素點,B1是3*3十字元素,B2是5*5十字元素。
d)循環膨脹、填充區域增長
figure; while 1 imshow(B2); if B1 == B2 break; else B1 = B2; B2=imdilate(B1,se) & img1; end end
圖像增長過程如下圖。
填充過程如下圖,先從B0開始膨脹,循環膨脹圖像不斷生長,當圖像超出邊界后與背景圖像(補集)相交限制圖像的邊界。直到圖像無法再生長,圖像完成內部區域填充。
上面的動圖選的起點種子元素在圖像區域外部,白色區域,所以填充過程白色區域膨脹然后只保留了圖像的內部區域為黑色。如果起始點種子元素在區域內部,則白色塊膨脹被圖像的邊界限制無法突破邊界,最終白色點越來越多,直至完成區域填充。
3、參考文獻
1、《數字圖像處理與機器視覺》,張錚、徐超、任淑霞、韓海玲編著
尊重原創技術文章,轉載請注明。