bwareafilt 在 MATLAB 中的奇怪行为及其使用的算法是什么?

Weird behaviour of bwareafilt in MATLAB and what algorithm does it use?

我有以下问题:

  1. bwareafilt使用的算法是什么?

  2. 奇怪的行为:当输入矩阵全黑时,出现以下错误

    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 is a function from the image processing toolbox that accepts a binary image and determines unique objects in this image. To find unique objects, a connected components analysis is performed where each object is assigned a unique ID. You can think of this as performing a flood fill on each object individually. A flood fill can be performed using a variety of algorithms - among them is depth-first search where you can consider an image as a graph where edges 连接到每个像素。在这种情况下,洪水填充会访问所有相互连接的像素,直到您没有更多像素可以访问并且位于该对象内。然后你继续下一个对象并重复相同的算法,直到你 运行 出对象。

之后,它通过计算属于该对象的像素数来确定每个对象的 "area"。一旦我们确定了每个对象的区域,我们就可以输出保留顶部 n 个对象的图像,或者过滤图像,以便只保留特定区域范围内的那些对象。

鉴于您上面的代码,您正在尝试输出一个图像,该图像是二值图像中最大的对象。因此,您使用的是前者,而不是后者 n=1.

bwareafilt

的奇怪行为

鉴于上述 bwareafilt 的描述和您的预期应用:

Actually, I am using this function to take snapshots from a webcam, but when I block my webcam totally, then I get above following error.

...错误不言自明。当您遮住网络摄像头时,整个画面都是黑色的,并且在图像中找不到任何物体。因为图像中没有物体,return 计算面积最大的物体是没有意义的,因为一开始就没有要 return 的物体。这就是您收到错误的原因,因为您试图制作 bwareafilt return 具有最大对象的图像,但图像中没有任何对象开始。

因此,如果你想使用bwareafilt,我建议你先检查整个图像是否是黑色的。如果 不是 黑色,则继续使用 bwareafilt。如果是,则跳过它。

做这样的事情,假设 b 是您要处理的图像:

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

以上代码使用 any 检查图像 b 中是否有 非零 的白色像素。如果有,那么应该适当调用bwareafilt。如果图像中没有任何白色像素,则只需将输出设置为 b 最初的样子(无论如何都是暗图像)。

您可以添加条件以使您的函数对任何输入都具有鲁棒性,例如,根据您使用函数过滤对象的条件,添加一个简单的条件来首先处理输入图像是否全黑.