matlab中水平垂直线,关于Matlab:水平-垂直线
我是Matlab的新手。 我有一个图像块,如下图所示:

白色显示像素的值等于1,黑色显示像素的值等于0,
我想获取vertical only lines。 这意味着应删除水平线,如下所示:

我也想得到horizontal only lines。 这意味着应删除垂直线,如下所示:

如何在Matlab中执行此操作? 为此,我更喜欢进行形态学操作。
我认为您将需要定义更多规则,例如1)1个像素既不能水平也不能垂直,那么应该将其删除吗? 2)如果一条水平线和一条垂直线相交,那么删除水平线也会从垂直线中删除一个像素。 您要如何处理? 3)您是否同意调用构成一条线的一组像素所需的最小像素为2? 一旦定义了这些,就可以直接检测到感兴趣的黑色像素的连续窗口。
有趣的问题,因为有很多方法可以做到这一点。
本质上,您需要取出特定尺寸的连续像素。
我想解决这个问题的一种方法是与[1 1]或[1 1]'向量进行卷积,然后取出获得值2的所有元素。
bw(conv2(bw,[1 1],'same')==2)=0;
这仍然会留下单个像素,您可以轻松使用
bw = bwareaopen(bw,2) ;
这只是主要想法,您可能需要在边缘周围更加小心,或使用零填充以免conv2可能产生的边缘伪像)...
另一个想法是,使用霍夫变换来检测线并仅保留theta = 0或90度的线...
谢谢您的回答。一种新方法...但是第二个答案是正确和完整的。 +1为您的答案
假设您的图片位于以下BW中:
% detecting all connected regions:
B = bwboundaries(BW,4);
这导致包含所有"补丁"的单元阵列B,这些"补丁"是通过连接值为1的相邻单元而形成的,这些值从4个侧面之一(即非对角线)连接。
例如:
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我将在几个小时内添加更多评论。什么是仅对角线边缘?
对角线边缘表示不包含的像素(水平和垂直线)。例如,在最后一张图像中,(8,2),(4,6)处的像素是对角线。也不能如点(6,12)所示是单一的。对于未定义对角线边缘的错误以及我的英文写作不好,我深表歉意。还要再次感谢您花费我的时间。
@ Babak.Abad请参阅我的编辑以获取更多说明和"对角线边缘"提取。
非常感谢您提供完整而全面的答案,并且最近进行了更新。就速度和复杂性而言,您所有的方法都比我的方法(连接组件分析)好。
