【问题标题】:is it possible to differentiate between different boundaries by use of bwboundaries in Matlab是否可以通过在 Matlab 中使用 bwboundaries 来区分不同的边界
【发布时间】:2013-10-07 18:15:37
【问题描述】:

我有一个灰度图像,其中有黑色、灰色和白色区域,我想做的是找到每个边界的长度和位置。函数 bwboundaries 工作得很好,但是我想问是否有办法区分不同的边界,例如是否有办法分别对黑色/灰色、白色/灰色和黑色/白色之间的边界进行分组。

提前感谢您的帮助

【问题讨论】:

    标签: matlab image-processing


    【解决方案1】:

    bwboundaries 自动将您的图像转换为二进制,因此您无法直接找到白色/灰色边界。

    从您的图像创建三个二进制图像:

    I1 = I>0; %both white/grey are 1, black is 0
    I2 = I==gvalue; %grey = 1, rest 0
    I3 = I==wvalue; %white = 1, rest 0
    

    然后,如果您为这些图像中的每一个设置 BW 边界(称它们为 B1, B2, B3),您最终会得到类似以下非常简单的示例:

    由此(我希望)在视觉上很直观,黑色和白色之间的边界(不包括任何灰色边界)位于 B1 和 B3(右侧图像)的交点处,依此类推。

    如何有效地定位这些交叉点是另一回事,并且可能还取决于您是否了解图像的性质 - 例如是白色和灰色的物体,通常是分开的、重叠的——是否有可能让一个灰色的物体完全被白色包围,等等。最基本的,您可以遍历找到的各种边界并使用intersect 和/或setdiff。一个问题是,使用这种方法,B2/B3 中应该是白色/灰色边界的边界彼此偏移了一个像素,所以我发现这种非常简化的情况的一种方法是:

    %Determine the grey/black and white/black intersections:
    B_gb = intersect(B1{1},B2{1},'rows');
    B_wb = intersect(B1{1},B3{1},'rows');
    
    %Set the white/grey intersection using setdiff and one of the boundaries we just found
    B_gw = setdiff(B2{1},B_gb,'rows');
    

    对于更大规模的情况,我建议首先确定哪些(如果有)边界在您的三个边界集中的任意两个中完全复制。例如,如果您有一个黑色背景下的白色区域不与任何灰色区域重叠,就会出现这种情况。


    查看您的实际图像,另一种选择是在获得三张二值图像后,使用像 canny 这样的寻边器。不过,这不会为您提供各个边界段的长度。

    BW1 = edge(I1,'canny'); % 等所有三个

    那么三组边(w/b、g/b、w/g)可以通过:

    GB = BW2&BW3; %etc 对于所有三个

    由于这些只是 BW 图像,因此可以使用以下方法提取绘图位置:

    [y x] = find(GB); % 并重复

    最终结果:

    【讨论】:

    • 首先要感谢您的大力帮助。其实我还是有一些问题,希望能得到更多的帮助。正如您建议的那样,我使用了“bwboundaries”和“相交”,但是我注意到虽然它适用于图像的角落,但在中心,我没有交集。由于字符限制,我无法复制我的代码,所以我正在复制原始图像的链接:i44.tinypic.com/2lu711t.jpg[/IMG] 和结果图像:i42.tinypic.com/34dhfms.jpg[/IMG]...thank you again...
    • 边界可能不完全重叠(因此您的边界相距 1 个像素,相交不会检测到)。另一种选择是使用边缘检测 - 我会更新。
    猜你喜欢
    • 2014-02-25
    • 2012-02-15
    • 2011-12-29
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    相关资源
    最近更新 更多