我有两个 bool 掩码,它们是从两个视频帧 i
和 i+1
的对象检测中获得的。现在我想“平均”它们以消除噪音。掩码是封闭的凸曲线。所以基本上我想找到它们之间的中间线。我该怎么做?
假设我们有两个连续帧的红色和蓝色标记,过滤后我们需要得到类似于两个轮廓之间的绿线的东西。
最佳答案
您可以使用 distance transform 完成此操作.
核心思想是计算到每个mask边缘的带符号距离,找到零水平集求平均值。该算法不需要凸掩模。我确实假设输入是实心蒙版(即填充轮廓)。
距离变换计算每个对象像素到最近的背景像素的(欧几里德)距离。到边缘的有符号距离由两个距离变换的组合形成:对象的距离变换和背景的距离变换(即倒置掩码)。后者从前者中减去,得到一幅图像,其中掩膜外的像素到掩膜边缘的距离为负,而内部像素的距离为正。掩码的边缘由零交叉点给出。
如果您计算到两个蒙版图像边缘的带符号距离,并将它们平均在一起,您将在两个蒙版边缘的正中间位置获得零交叉。简单地对此结果进行阈值处理即可得到平均掩码。
请注意,由于我们将阈值设置为 0,因此两个有符号距离之和或它们的平均值之间没有差异。总和的计算成本更低。
这是一个示例,使用您的颜色编码(红色和蓝色是两个输入的边缘,绿色是输出的边缘):
下面的代码是带有 DIPimage 的 MATLAB,我写它只是为了显示结果。只需将其视为供您使用 OpenCV 实现的伪代码。 :)
% inputs: mask1, mask2: binary images
d1 = dt(mask1) - dt(~mask1); % dt is the distance transform
d2 = dt(mask2) - dt(~mask2); % ~ is the logical negation
mask = (d1+d2) > 0; % output
关于opencv - 如何平均两个面具?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51409818/