opencv - 如何平均两个面具?

标签 opencv image-processing scipy computer-vision filtering

我有两个 bool 掩码,它们是从两个视频帧 ii+1 的对象检测中获得的。现在我想“平均”它们以消除噪音。掩码是封闭的凸曲线。所以基本上我想找到它们之间的中间线。我该怎么做?

举个例子: Example

假设我们有两个连续帧的红色和蓝色标记,过滤后我们需要得到类似于两个轮廓之间的绿线的东西。

最佳答案

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

核心思想是计算到每个mask边缘的带符号距离,找到零水平集求平均值。该算法不需要凸掩模。我确实假设输入是实心蒙版(即填充轮廓)。

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

如果您计算到两个蒙版图像边缘的带符号距离,并将它们平均在一起,您将在两个蒙版边缘的正中间位置获得零交叉。简单地对此结果进行阈值处理即可得到平均掩码。

请注意,由于我们将阈值设置为 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

关于opencv - 如何平均两个面具?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51409818/

相关文章:

scipy - 解释 scipy 差分进化中顶级参数的直觉

Python OpenCV : inverting colors in a numpy image array

c++ - 如何在OpenCV中比较两个Mats列

使用 OpenGL 处理 Android 相机帧

python - 如何拟合4点的椭圆轮廓?

image - ASIFT 和 SIFT 的替代解决方案?

python - NumPy 或 SciPy 计算加权中位数

opencv - 如何从双目视觉中获取点云

c++ - 确定没有 EXIF 数据的图像之间的停止差异

python - 从时间序列数据创建正弦波 (Python)