我是matlab新手。我有圖像塊如下圖所示: 水平垂直只有線
白人顯示像素它們的值等於1
和黑人顯示像素它們的值等於0
,
我想vertical only lines
。這意味着,如下圖所示水平線應該被刪除:
此外,我想horizontal only lines
。這意味着如下圖所示的垂直線應刪除:
我怎樣才能做到這一點在Matlab
?我更喜歡這種形態操作。
我是matlab新手。我有圖像塊如下圖所示: 水平垂直只有線
白人顯示像素它們的值等於1
和黑人顯示像素它們的值等於0
,
我想vertical only lines
。這意味着,如下圖所示水平線應該被刪除:
此外,我想horizontal only lines
。這意味着如下圖所示的垂直線應刪除:
我怎樣才能做到這一點在Matlab
?我更喜歡這種形態操作。
假設你的圖像是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'
這種方法將忽略任何不是單細胞粗線的物體,因此,例如,下圖中間的正方形將僅顯示在對角線邊緣圖案:
不好意思,有什麼方法可以識別對角線邊緣嗎?我寧願不使用圖像減法。 –
親愛的'EBH',如果有可能,請提供更多關於'算法如何執行'的評論' –
@ Babak.Abad我會在幾個小時內添加更多評論。什麼是_diagonal-only edges_? – EBH
有趣的問題,因爲有很多方法可以做到這一點。實質上,您需要取出特定維度的連續像素。 我看到要解決這個問題的一種方法是用[1 1]
或[1 1]'
向量進行卷積,然後取出所有獲得值2的元素。
bw(conv2(bw,[1 1],'same')==2)=0;
這仍然會離開,你可以取出的單個像素輕易使用
bw = bwareaopen(bw,2) ;
這僅僅是個主要的想法,你可能必須是周圍的邊緣多加小心,或用零墊避免邊緣文物,CONV2可以)...
另一個想法,使用Hough transform檢測線,只保留那些有THETA = 0或90度......
謝謝,尋求答案。一種新的方式...但第二個答案是正確和完整的。 +1爲您的答案 –
我想你會ñ定義一些更多的規則,如 1)1個像素既不能水平也不能垂直,那麼它是否會被刪除? 2)如果水平線和垂直線在某一點相交,那麼移除水平線也會從垂直線中移除一個像素。你想怎麼處理它? 3)你是否同意調用一組像素形成一條直線所需的最小像素數是2? 定義這些之後,可能會直接檢測感興趣的黑色像素的連續窗口。 – Abhinav