增长位掩码边框而不触摸对象

时间:2018-03-23 15:38:31

标签: c# image-processing computer-vision

我已经在C#中编写了一个位掩码过滤器,以增加边框,如果有足够的空间,找到的像素应该会增加边框,但这些区域可能不会相互接触

input mask   output mask
..........    .....xxx...
.....x....    .....xxxx...
.....x....    xxx..xxxxxx.
..x..xxxx.    xxx..xxxxxx.
..........    xxx..xxxxxx.

使用检查边框的5x5二进制卷积 边框包含8个像素(x-2,y-2)(x,y-2)(x+2,y-2) ...即角落和边框中心。
如果找到像素,我将其对应的数组P[i]设置为true 因此,这8个像素以P[0]通过p[7]开始的布尔数组表示。

接下来我计算布尔值true

如果计算P[.] > 3,则附近有另一个物体,我不会在那里长出边界。

如果计数为1,那么如果例如(x-2,y)==true,则写掩码(x-1,y)

如果计数为2,那么如果例如(x+2,y)==true && (x+2,y+2)==true则写掩码(x+1,y+1)

我有很多布尔比较最终使这项工作成功。 我不会让你厌倦沉闷的代码,但我想知道我使用的原理是否适用于此,或者是否存在其他方法来执行此操作。

因为我有副作用(虽然不是真正的问题),这使得形状在每次迭代时都更加立方。在PhotoShop这样的程序中似乎发生的情况较少。

=====
一些额外的信息,代码必须在视频流上运行,所以我更喜欢快速的方式。我写了#34;沉闷"代码,如果我打印它的80多行,大多数是二进制比较代码和切换案例也使它快速,80+是一个长篇文章在这里,更容易理解用正常语言解释。

1 个答案:

答案 0 :(得分:0)

你听说过数学形态学吗?你或多或少地实现了thickening operator(虽然加厚的定义不同,我认为结果或多或少相似),但是有更有效的方法来做同样的事情。

另一种方法是:

  • 计算图像反转的distance transform。这是一个图像,你离你的物体越远,灰度值越大。该图像将在对象之间具有正好一半的脊。我们将此图片称为distance

  • 计算distance的{​​{3}}。这是一个二进制图像,其中的行沿着distance的脊。我们称之为separation

  • watershed distance以适当的值来获取您想要的数量增长的对象。如果要将对象增长10个像素,则选择阈值,以便选择值小于或等于10的所有像素(true)。

  • separation中减去distancedistance中已设置并在separation中设置的像素应重置。现在,您的原始对象按您选择的距离增长,但仍然是分开的。

我不会厌烦你沉闷的代码...