去噪图像分割图

时间:2019-10-18 15:14:13

标签: python numpy opencv rgb mask

我已经在CelebA-Mask-HQ数据集(https://github.com/switchablenorms/CelebAMask-HQ上训练了一个面部分割模型,该模型能够为背景,眼睛,面部,头发,等等。该模型会生成一个形状为(1024,1024,3)的numpy数组。输出的分割图有点嘈杂,例如,脸上的一些随机像素被标记为眼睛,或者当它实际上是背景时弹出了布料标签,请参见下图:

enter image description here

如您在图像中看到的,在左上角看到绿色像素,在胡须周围的脸部看到绿色像素(在黄色上唇图上方)。

我想通过更改图像中这些错误标记的小片段(由较大的正确标记的区域包围)自动将其更改为该区域中最主要的颜色(具有可调整的窗口),从而从分割图中删除此“噪声”尺寸)。我找不到内置的opencv功能。您是否知道执行此操作的任何有效方法(我需要对大量图像进行“去噪”,所以理想情况下是采用仅矢量化的numpy方式)?

非常重要的是,去噪后的图像仅包含一组预定义的标签颜色(总共19种不同的颜色),因此需要以绝对的方式对噪声进行重新着色而不进行平均(这会为该颜色引入新的颜色)图片的调色板)。

谢谢!

1 个答案:

答案 0 :(得分:1)

我可以使您远离openCV,而转向我更熟悉的scikit-image。我将使用从this tutorial借用的方法来解决这个问题。

具体来说,我会做这样的事情:

label_image = label(image)

for region in regionprops(label_image):
    # only recolor areas that are under a certain threshold size
    if region.area <= 100:
        #get creative with which color to recolor with...
        minr, minc, maxr, maxc = region.bbox
        colors = np.bincount(label_image[minr : maxr, minc:maxc])
        max_color = -1
        for i in range(len(colors)):
            if (colors[i] > max_color) and (i != region.label):
                max_color = colors[i]
        crop_image = label_image[minr : maxr, minc:maxc]
        label_image[minr : maxr, minc:maxc][crop_image == region.label] = max_color

我还没有尝试过此代码...但是我认为类似的方法可能有效。让我知道它是否有帮助。