【发布时间】:2013-10-07 18:15:37
【问题描述】:
我有一个灰度图像,其中有黑色、灰色和白色区域,我想做的是找到每个边界的长度和位置。函数 bwboundaries 工作得很好,但是我想问是否有办法区分不同的边界,例如是否有办法分别对黑色/灰色、白色/灰色和黑色/白色之间的边界进行分组。
提前感谢您的帮助
【问题讨论】:
我有一个灰度图像,其中有黑色、灰色和白色区域,我想做的是找到每个边界的长度和位置。函数 bwboundaries 工作得很好,但是我想问是否有办法区分不同的边界,例如是否有办法分别对黑色/灰色、白色/灰色和黑色/白色之间的边界进行分组。
提前感谢您的帮助
【问题讨论】:
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); % 并重复
最终结果:
【讨论】: