我已经在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+是一个长篇文章在这里,更容易理解用正常语言解释。
答案 0 :(得分:0)
你听说过数学形态学吗?你或多或少地实现了thickening operator(虽然加厚的定义不同,我认为结果或多或少相似),但是有更有效的方法来做同样的事情。
另一种方法是:
计算图像反转的distance transform。这是一个图像,你离你的物体越远,灰度值越大。该图像将在对象之间具有正好一半的脊。我们将此图片称为distance
。
计算distance
的{{3}}。这是一个二进制图像,其中的行沿着distance
的脊。我们称之为separation
。
watershed distance
以适当的值来获取您想要的数量增长的对象。如果要将对象增长10个像素,则选择阈值,以便选择值小于或等于10的所有像素(true
)。
从separation
中减去distance
。 distance
中已设置并在separation
中设置的像素应重置。现在,您的原始对象按您选择的距离增长,但仍然是分开的。
我不会厌烦你沉闷的代码...