我有一个灰度图像,其中有黑色、灰色和白色区域,我想做的是找到每个边界的长度和位置。函数 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);
% 并重复
最后结果: