【问题标题】:Weird behaviour of bwareafilt in MATLAB and what algorithm does it use?MATLAB 中 bwareafilt 的奇怪行为以及它使用什么算法?
【发布时间】:2015-08-29 13:44:18
【问题描述】:
我有以下问题:
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);
实际上,我正在使用此功能从网络摄像头拍摄快照,但是当我完全阻止我的网络摄像头时,我会遇到以下错误。
所以我认为这是由于一些内部实现错误而导致的错误。是这样吗?我该如何克服这个问题?
【问题讨论】:
标签:
image
algorithm
matlab
image-processing
【解决方案1】:
您可以添加条件以使您的函数对任何输入都具有鲁棒性,例如,根据您使用函数过滤对象的条件,添加一个简单的条件来首先处理输入图像是否全黑。
【解决方案2】:
让我们一次一个地回答你的问题:
bwareafilt 使用什么算法?
bwareafilt 是图像处理工具箱中的一个函数,它接受二值图像并确定该图像中的唯一对象。为了找到唯一的对象,执行连通分量分析,其中每个对象都被分配一个唯一的 ID。您可以将其视为单独对每个对象执行泛洪填充。可以使用多种算法执行泛洪填充 - 其中包括depth-first search,您可以将图像视为graph,其中edges 连接到每个像素。在这种情况下,填充填充会访问所有相互连接的像素,直到您没有更多要访问的像素并且位于该对象内。然后您继续下一个对象并重复相同的算法,直到您用完对象。
之后,它通过计算属于该对象的像素数来确定每个对象的“面积”。一旦我们确定了每个对象的区域,我们可以输出保留顶部n 对象的图像,或者过滤图像,以便仅保留特定区域范围内的对象。
鉴于上面的代码,您正在尝试输出一个图像,该图像是二进制图像中最大的对象。因此,您使用的是前者,而不是后者n=1。
bwareafilt 的奇怪行为
鉴于以上对bwareafilt 的描述以及您的预期应用:
实际上,我正在使用此功能从网络摄像头拍摄快照,但是当我完全阻止我的网络摄像头时,我会遇到以下错误。
...错误是不言自明的。当您盖上网络摄像头时,整个画面都是黑色的,并且图像中没有发现任何物体。因为图像中没有物体,所以返回面积最大的物体是没有意义的,因为没有物体可以返回。这就是您收到错误的原因,因为您试图让 bwareafilt 返回具有最大对象的图像,但您的图像中没有任何对象。
因此,如果您想使用bwareafilt,我建议您先检查整个图像是否为黑色。如果它不是黑色,请继续使用bwareafilt。如果是,则跳过它。
假设b 是您要处理的图像,请执行以下操作:
if any(b(:))
Iz = bwareafilt(b, 1);
else
Iz = b;
end
以上代码使用any 来检查您的图像b 中是否有任何非零 的白色像素。如果有,则应适当调用bwareafilt。如果图像中没有任何白色像素,则只需将输出设置为 b 原来的样子(无论如何都是暗图像)。