2017-02-12 187 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为您的答案 –