是否可以使用Matlab中的边界来区分不同的边界

是否可以使用Matlab中的边界来区分不同的边界,matlab,image-processing,Matlab,Image Processing,我有一个灰度图像,其中有黑色、灰色和白色区域,我试图做的是找到每个边界的长度和位置。函数bwBounders工作正常,但是我想问是否有方法区分不同的边界,例如是否有方法将黑/灰、白/灰和黑/白之间的边界分别分组 提前感谢您的帮助bwBounders会自动将图像转换为二进制图像,因此您无法直接使用它查找白色/灰色边界 从图像中创建三个二进制图像: I1 = I>0; %both white/grey are 1, black is 0 I2 = I==gvalue; %grey = 1, r

我有一个灰度图像,其中有黑色、灰色和白色区域,我试图做的是找到每个边界的长度和位置。函数bwBounders工作正常,但是我想问是否有方法区分不同的边界,例如是否有方法将黑/灰、白/灰和黑/白之间的边界分别分组


提前感谢您的帮助

bwBounders
会自动将图像转换为二进制图像,因此您无法直接使用它查找白色/灰色边界

从图像中创建三个二进制图像:

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
然后,如果您为这些图像中的每个图像(称它们为
B1、B2、B3
)获取BW边界,您将得到如下非常简单的示例:

从这一点来看,(我希望)视觉上直观的是,黑色和白色之间的边界(不包括任何灰色边界)位于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')%etc

然后可以通过以下方式找到三组边(w/b、g/b、w/g):

GB=BW2&BW3%etc

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

[yx]=find(GB)%并重复

最终结果:

bwBounders
自动将图像转换为二进制图像,因此您无法直接使用它查找白色/灰色边界

从图像中创建三个二进制图像:

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
然后,如果您为这些图像中的每个图像(称它们为
B1、B2、B3
)获取BW边界,您将得到如下非常简单的示例:

从这一点来看,(我希望)视觉上直观的是,黑色和白色之间的边界(不包括任何灰色边界)位于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')%etc

然后可以通过以下方式找到三组边(w/b、g/b、w/g):

GB=BW2&BW3%etc

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

[yx]=find(GB)%并重复

最终结果:

首先我要感谢您的大力帮助。事实上,我还有一些问题,希望能得到更多帮助。正如您所建议的,我使用了“边界”和“相交”,但是我注意到,虽然它适用于图像的角部,但在中心,我没有相交。由于字符限制,我无法复制我的代码,因此我正在复制原始图像的链接:以及生成的图像:您再次…边界可能没有完全重叠(因此您的边界相隔1个像素,相交不会检测到)。另一种选择是使用边缘检测-我会更新。我首先要感谢你的帮助。事实上,我仍然有一些问题,希望我能得到更多的帮助。正如您所建议的,我使用了“边界”和“相交”,但是我注意到,虽然它适用于图像的角部,但在中心,我没有相交。由于字符限制,我无法复制我的代码,因此我正在复制原始图像的链接:以及生成的图像:您再次…边界可能没有完全重叠(因此您的边界相隔1个像素,相交不会检测到)。另一种选择是使用边缘检测-我会更新。