如何平均两个口罩?

时间:2018-07-18 19:38:50

标签: opencv image-processing scipy computer-vision filtering

我从两个视频帧ii+1的对象检测中获得了两个布尔蒙版。现在,我想“利用”它们以消除噪音。遮罩是闭合的凸曲线。所以基本上我想找到它们之间的中间线。我该怎么办?

这里是一个示例: Example

假设我们在两个连续的帧中有两个红色和蓝色的麦芽,经过过滤后,我们需要得到两个轮廓之间的绿线。

1 个答案:

答案 0 :(得分:1)

您可以使用distance transform完成此操作。

核心思想是计算到每个蒙版边缘的有符号距离,并找到为平均值设置的零电平。对于该算法,不需要凸掩膜。我确实假设输入是实体遮罩(即填充的轮廓)。

距离变换计算每个对象像素到最近的背景像素的(欧几里得)距离。到边缘的有符号距离由两个距离变换的组合形成:对象的距离变换和背景(即倒置蒙版)的距离变换。从前者减去后者后得到的图像是,蒙版外部的像素到蒙版边缘的距离为负,而内部蒙版的像素的距离为正。遮罩的边缘由零交叉点给出。

如果计算到两个蒙版图像边缘的符号距​​离,并将它们平均在一起,则将在两个蒙版边缘的正中位置获得零交叉。只需对结果进行阈值处理即可获得平均蒙版。

请注意,由于我们将阈值设为0,所以两个有符号距离的总和或平均值之间没有区别。该总和的计算成本较低。

以下是使用颜色编码的示例(红色和蓝色是两个输入的边缘,绿色是输出的边缘):

enter image description here

下面的代码是带有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