【问题标题】:Weird behaviour of bwareafilt in MATLAB and what algorithm does it use?MATLAB 中 bwareafilt 的奇怪行为以及它使用什么算法?
【发布时间】:2015-08-29 13:44:18
【问题描述】:

我有以下问题:

  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);
    

    实际上,我正在使用此功能从网络摄像头拍摄快照,但是当我完全阻止我的网络摄像头时,我会遇到以下错误。


所以我认为这是由于一些内部实现错误而导致的错误。是这样吗?我该如何克服这个问题?

【问题讨论】:

    标签: 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 原来的样子(无论如何都是暗图像)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-11
        • 2015-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-18
        相关资源
        最近更新 更多