【问题标题】:Denoising segmentation map of image图像去噪分割图
【发布时间】:2020-02-15 14:50:27
【问题描述】:

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

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

我想通过将图像中这些被正确标记的较大区域包围的错误标记的小片段自动更改为该区域中最主要的颜色,从而从分割图中移除这种“噪音”(使用自适应窗口尺寸)。我找不到为此的内置 opencv 功能。您是否知道任何有效的方法来做到这一点(我需要对大量图像进行“去噪”,因此最好采用仅矢量化的 numpy 方式)?

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

谢谢!

【问题讨论】:

    标签: python numpy opencv rgb mask


    【解决方案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
    
    

    我还没有尝试过这段代码......但我认为这样的事情可能会奏效。让我知道它是否有帮助。

    【讨论】:

      猜你喜欢
      • 2011-08-16
      • 2018-09-08
      • 1970-01-01
      • 2012-07-03
      • 2016-12-13
      • 1970-01-01
      • 2022-10-21
      • 2022-10-17
      • 2015-05-20
      相关资源
      最近更新 更多