【问题标题】:horizontal-vertical only lines仅水平垂直线
【发布时间】:2017-06-30 08:03:30
【问题描述】:

我是 matlab 新手。我有一个图像块,如下图所示:

白人显示像素值等于1,黑人显示像素值等于0

我想得到vertical only lines。这意味着应该删除水平线,如下图所示:

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

如何在Matlab 中做到这一点?我更喜欢形态学操作。

【问题讨论】:

  • 我想你需要再定义一些规则,比如1)1个像素不能是水平的,也不能是垂直的,那么它应该被删除吗? 2)如果水平线和垂直线在一点交叉,那么删除水平线也会从垂直线上删除一个像素。你想怎么处理? 3)您是否同意调用形成一条线的一组像素所需的最小像素是两个?一旦定义了这些,就可以直接检测感兴趣的黑色像素的连续窗口。

标签: matlab image-processing image-morphology


【解决方案1】:

假设你的图片是BW下面:

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

这将生成一个单元格数组 B,其中包含所有“补丁”,这些“补丁”是通过将具有值 1 的相邻单元格连接起来的,这些单元格从 4 条边之一连接,即不在对角线上。

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,如果可以的话,请提供更多关于“你的算法如何执行”的cmets
  • @Babak.Abad 我将在几个小时内添加更多评论。什么是仅对角线
  • 对角边缘是指不包括在(水平和垂直线)中的像素。例如,在您的最后一张图像中,(8,2)、(4,6) 处的像素是对角线。如第 (6,12) 点所示,它也不能是单一的。我为我没有定义对角线边缘和我糟糕的英语写作的错误道歉。也再次感谢您为我的问题所花费的时间。
  • @Babak.Abad 查看我的编辑以获取更多解释和“对角边缘”提取。
【解决方案2】:

有趣的问题,因为有很多方法可以做到这一点。 本质上,您需要取出特定尺寸的连续像素。 我认为解决此问题的一种方法是与 [1 1][1 1]' 向量进行卷积,然后取出您获得值 2 的所有元素。

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

这仍然会留下单个像素,您可以使用它们轻松取出

bw = bwareaopen(bw,2) ;

这只是主要思想,您可能需要更加小心边缘,或者用零填充以避免 conv2 可能产生的边缘伪影)...

另一个想法,使用Hough transform 来检测线条并只保留那些具有 theta=0 或 90 度的线条...

【讨论】:

  • 谢谢您的回答。一种新方法......但第二个答案是正确且完整的。为您的回答 +1
猜你喜欢
  • 2011-10-29
  • 2012-11-19
  • 2014-05-04
  • 2013-05-31
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
  • 1970-01-01
相关资源
最近更新 更多