2017-02-12 159 views
2

我是matlab新手。我有圖像塊如下圖所示: enter image description here水平垂直只有線

白人顯示像素它們的值等於1和黑人顯示像素它們的值等於0

我想vertical only lines。這意味着,如下圖所示水平線應該被刪除:

enter image description here

此外,我想horizontal only lines。這意味着如下圖所示的垂直線應刪除:

enter image description here

我怎樣才能做到這一點在Matlab?我更喜歡這種形態操作。

+0

我想你會ñ定義一些更多的規則,如 1)1個像素既不能水平也不能垂直,那麼它是否會被刪除? 2)如果水平線和垂直線在某一點相交,那麼移除水平線也會從垂直線中移除一個像素。你想怎麼處理它? 3)你是否同意調用一組像素形成一條直線所需的最小像素數是2? 定義這些之後,可能會直接檢測感興趣的黑色像素的連續窗口。 – Abhinav

回答

1

假設你的圖像是BW下面:

% detecting all connected regions: 
B = bwboundaries(BW,4); 

這導致包含由連接與從4個側面中的一個連接的值1相鄰小區進行的所有的「貼劑」的單元陣列B即不在對角線上。

B = 
    [11x2 double] 
    [ 2x2 double] 
    [ 3x2 double] 
    [ 3x2 double] 
    [ 2x2 double] 
    [ 3x2 double] 
    [ 2x2 double] 
    [ 2x2 double] 
    [ 3x2 double] 
    [ 3x2 double] 
    [ 2x2 double] 
    [11x2 double] 

例如:

>> B{6} 
ans = 
    3  7 
    3  8 
    3  7 

每一行是一個單元的座標。第一列是「行,第二列」,第一個和最後一個單元總是相同的。

現在我們需要循環遍歷B中的單元格,並查找它們中哪些是水平或垂直的線條,並將它們保存到新的矩陣中。

% matrices for horizontal and vertical lines: 
BWh = zeros(size(BW)); % horizontal lines 
BWv = zeros(size(BW)); % vertical lines 
for k = 1:numel(B) 
    % if the coordinates changes ONLY vertically: 
    % a vertical line is where all the coulmn indecies are the same 
    % and there are different row indices 
    if all(B{k}(1,2)==B{k}(:,2)) && B{k}(1,1)~=B{k}(2,1) 
     BWv(sub2ind(size(BW),B{k}(:,1),B{k}(:,2))) = 1; 
    end 
    % if the coordinates changes ONLY horizontaly: 
    % a vertical line is where all the row indecies are the same 
    % and there are different column indices 
    if all(B{k}(1,1)==B{k}(:,1)) && B{k}(1,2)~=B{k}(2,2) 
     BWh(sub2ind(size(BW),B{k}(:,1),B{k}(:,2))) = 1; 
    end 
end 
subplot 131 
imagesc(BWh) 
title('Horizontal lines') 
subplot 132 
imagesc(BWv) 
title('Vertical lines') 

「對角線邊緣」是什麼留給我們排除線後,所以我們只是看什麼,我們沒有到目前爲止發現:

subplot 133 
imagesc(BW & ~BWv & ~BWh) 
title('Diagonal edges') 
colormap 'gray' 

BWvh

這種方法將忽略任何不是單細胞粗線的物體,因此,例如,下圖中間的正方形將僅顯示在對角線邊緣圖案:

box demo

+0

不好意思,有什麼方法可以識別對角線邊緣嗎?我寧願不使用圖像減法。 –

+0

親愛的'EBH',如果有可能,請提供更多關於'算法如何執行'的評論' –

+0

@ Babak.Abad我會在幾個小時內添加更多評論。什麼是_diagonal-only edges_? – EBH

1

有趣的問題,因爲有很多方法可以做到這一點。實質上,您需要取出特定維度的連續像素。 我看到要解決這個問題的一種方法是用[1 1][1 1]'向量進行卷積,然後取出所有獲得值2的元素。

bw(conv2(bw,[1 1],'same')==2)=0; 

這仍然會離開,你可以取出的單個像素輕易使用

bw = bwareaopen(bw,2) ; 

這僅僅是個主要的想法,你可能必須是周圍的邊緣多加小心,或用零墊避免邊緣文物,CONV2可以)...

另一個想法,使用Hough transform檢測線,只保留那些有THETA = 0或90度......

+0

謝謝,尋求答案。一種新的方式...但第二個答案是正確和完整的。 +1爲您的答案 –