我有以下问题:
bwareafilt使用的算法是什么?
怪异行为:当输入矩阵完全为黑色时,我会得到以下错误

Error using bwpropfilt (line 73)
Internal error: p must be positive.
Error in bwareafilt (line 33)
bw2 = bwpropfilt(bw, 'area', p, direction, conn);
Error in colour_reception (line 95)
Iz=bwareafilt(b,1);

实际上,我是用这个功能从一个摄像头上拍摄快照,但当我完全阻止我的摄像头,然后我得到以上以下错误。
所以我认为这是由于一些内部实现错误造成的错误是这样吗?我该如何克服?

最佳答案

让我们逐一回答您的问题:
bwareafilt使用什么算法?
bwareafilt是图像处理工具箱中的一个函数,它接受二进制图像并确定该图像中的唯一对象。若要查找唯一对象,将在为每个对象分配唯一ID的位置执行连接组件分析。可以将此视为对每个对象分别执行整体填充。可以使用多种算法执行泛洪填充-其中有depth-first search算法,可以将图像视为graph算法,其中edges连接到每个像素。在这种情况下,flood fill访问所有彼此连接的像素,直到您没有更多的像素可访问,并且这些像素已在此对象中本地化。然后继续下一个对象并重复相同的算法,直到对象用完为止。
之后,它通过计算属于每个对象的像素数来确定每个对象的“区域”一旦我们确定了每个对象的区域,我们就可以输出一个保留顶部对象的图像,或者对图像进行过滤,以便仅保留在特定区域范围内的对象。
根据上面的代码,您正试图输出一个图像,该图像是二进制图像中最大的对象因此,您使用的是前者,而不是后者。
n的怪异行为
鉴于以上对n=1的描述和您的预期应用:
实际上,我是用这个功能从一个摄像头上拍摄快照,但当我完全阻止我的摄像头,然后我得到以上以下错误。
…这个错误是不言而喻的当你覆盖摄像头时,整个画面是黑色的,图像中没有任何物体。由于图像中没有对象,因此返回具有最大区域的对象是没有意义的,因为没有要返回的对象。这就是为什么您会得到这个错误,因为您正试图使bwareafilt返回一个带有最大对象的图像,但是图像中没有任何对象可以开始。
因此,如果您想使用bwareafilt,我建议您首先检查整个图像是否为黑色。如果不是黑色,那么继续使用bwareafilt。如果是,那就跳过它。
做这样的事情,假设bwareafilt是您要处理的图像:

if any(b(:))
    Iz = bwareafilt(b, 1);
else
    Iz = b;
end

上面的代码使用bwareafilt检查图像中是否有非零的白色像素b如果存在,则应适当调用any。如果图像中没有任何白色像素,那么只需将输出设置为原来的b即可(无论如何这是一个黑色图像)。

关于image - bwareafilt在MATLAB中的怪异行为,它使用什么算法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30821853/

10-10 13:21