我有一个灰度图像,其中有黑色,灰色和白色区域,我想要做的是找到每个边界的长度和位置。函数bwboundaries工作正常,但是我想询问是否有办法区分不同的边界,例如,如果有办法分别对黑/灰,白/灰和黑/白之间的边界进行分组。
提前感谢您的帮助
答案 0 :(得分:3)
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;
%等
由于这些只是BW图像,因此可以使用以下方法提取绘图位置:
[y x] = find(GB);
%并重复
最终结果: