2016-08-16 65 views
2

我正在增厚二值圖像。我希望將標籤增大到每個方向的n個像素。嘗試在MATLAB中保存形狀時的形態學增厚/膨脹

原圖:

Original label image

起初我使用的功能bwmorph(I, '勾芡',25),並得到了這個形象:

After morphological thickening

這是沒有好。增厚似乎使用結構元素[0,1,0; 1,1,1; 0,1,0],所以它總是將圓形轉換爲菱形。與所提及的結構化元素相結合產生相同的輸出。

接下來,我嘗試用結構元素[1,1,1; ...]迭代地迭代原始圖像n = 25次。 1,1,1; 1,1,1],得到了下面的圖片:

iterative dilation

原來的形狀現在已經完全消失了。

我知道膨脹會在一定程度上扭曲邊界。我與結構元素「盤」試驗(R = 5,擴張5倍),並獲得了較好的成績:

enter image description here

這是因爲它得到好處呢?如果我希望儘可能保留原始的圓形,我應該選擇哪種結構元素?對於特定的擴張距離(它可以從10-100變化,標籤從圓形變爲橢圓形)找到合適的尺寸有沒有什麼好的經驗法則?在嘗試保持原始形狀的同時,是否有更好的方法在所有方向上生成二值圖像?

有沒有辦法保持歐拉特性 - 保持加厚質量,同時將結構元素更改爲更合適的東西?

+0

適合並平滑輪廓。 –

回答

2

試試這個:

bw = imread('bw.png'); 
figure; imshow(imdilate(bw, strel('arbitrary', bw))) 

我現在用的是圖像本身的擴展它。它給出了一個更加保形生長:

UPDATE:作爲@Tapio說,可以很容易地調整使用imresize調整大小因子:

figure; imshow(imdilate(bw, strel('arbitrary', imresize(bw, 0.5)))) 

與下面的輸出:

enter image description here

+1

這工作得非常好。 imdilate(bw,strel('任意',imresize(bw,0.1)))保持邊框完整無缺,並讓您調整增長大小。 – Tapio

+0

你說得對,使用'imresize'要方便得多。我會更新我的帖子。 – erfan

1

如果你只使用單一的結構元素,那麼你將永遠面對你描述的問題。如果你想擴大一個大小爲N的結構元素的形狀,不要使用N次大小爲1的結構元素,否則你會以美麗的意外變形結束。

如果您想擴大尺寸N,請嘗試使用半徑爲N的磁盤。但是,處理時間會更長。

另一種解決方案是使用距離圖:形狀是種子(距離0),那麼所有距離小於N的距離都是結果。它與N的膨脹非常相似。

+0

距離圖看起來非常有用!然而,在這種情況下,原始圖像大約爲2000x1000,大多數爲0,因爲它能方便地將標籤覆蓋在原始RGB圖像上,而無需分別跟蹤座標。所以做距離變換實際上比大規模的擴散慢一個數量級,至少在我做的測試中。 – Tapio

+0

距離圖只是計算轉換的一個方法,它本身不是一個結果。一旦你計算出距離圖,你就可以找到標籤。在圖像2000x1000上計算距離圖應該很快。 – FiReTiTi

+0

當然,我明白了。我剛剛注意到,在我的機器上運行一些測試時,初始距離變換通常比用N大小的磁盤膨脹慢一個數量級。兩者都是如此之快以至於無關緊要,只是指出在這種情況下用大磁盤擴張是可行的。 – Tapio