在OpenCV中使用混合无缝克隆进行错误隐藏

时间:2016-02-25 14:36:18

标签: c++ opencv image-processing medical

背景

我想用OpenCV for C ++中的皮肤镜图像去除毛发,而不是两种结合所需的结果:

  • 使用计算机视觉进行进一步分析的预处理
  • 光学感知的改善(即没有皮肤病变的分散)

这种方法需要是全自动的,并且应该 - 尽可能地 - 尽可能快地工作,尽管我需要实时计算。以下是我所谈论的示例图片:

Example input image

这样做的第一步是找到并遮盖头发像素。经过一些基本的预处理后,我成功地(错误地)使用了众所周知的Frangi filter并为头发创建了一个二元掩码:

Hair mask

初步方法

现在是修补部分。首先,按照一些领域相关论文的想法,我自己尝试使用一组形态学操作 - 几乎没有令人信服的结果:

Hair removal with morphological operations

除此之外,显而易见的尝试是使用OpenCV的inpaint()函数。结果更好,但仍然不完美 - 计算需要很长时间:

Hair removal with Navier-Stokes

问题

有一篇关于Poisson Image Editing的优秀论文,最近在OpenCV中以seamlessClone()的形式实现了。在本文中,这种混合克隆方法也被用于错误隐藏,并且结果很有希望。

他们使用手动选择隐藏的源区域,在我的情况下将是一些不受干扰的皮肤。然而,这应该是一个全自动的解决方案,我只知道图像的哪个部分是头发,哪个不是。

如何使用简单的蒙版进行无缝克隆的自动修复?我找不到OpenCV的任何直接实现,目前我没有想法如何解决这个问题。任何人吗?

1 个答案:

答案 0 :(得分:0)

The second image looks pretty good, in this case I would propose to work in it by applying a high-pass filter. This is very similar to the median filters that are used to smooth images. But in your case you need to remove some darker pixels in certain neighborhoods. I'd use the hair mask to apply the high-pass filter in those pixels.

You can find info of the median filter here.