我已经在CelebA-Mask-HQ数据集(https://github.com/switchablenorms/CelebAMask-HQ )上训练了一个人脸分割模型,该模型能够为背景、眼睛、面部、头发等创建具有不同颜色的图像的颜色分割映射。该模型产生一个数字形状数组(1024,1024,3)。输出的分割图有点嘈杂,例如人脸上的一些随机像素被标记为眼睛,或者当它实际上是背景时会弹出布料标签,请参见下图:
正如您在图像中所看到的,在左上角,您可以看到绿色像素,而在胡子周围的面部,您可以看到绿色像素(在黄色上嘴唇贴图的上方)。
我想通过将图像中被更大的正确标记的区域包围的这些错误标记的小片段自动更改为该区域中最主要的颜色(具有可调整的窗口大小)来从分割图中删除这种“噪声”。我找不到内置的opencv功能。你知道有什么有效的方法来做到这一点(我需要对一大组图像进行‘去噪’,所以理想情况下是以一种矢量化的数字唯一的方式)?
非常重要的是,去噪后的图像只包含一组预定义的标签颜色(总共19种不同的颜色),因此噪声需要以绝对的方式重新着色,而不是平均(这将向图像的调色板引入新的颜色)。
谢谢!
发布于 2019-10-18 18:04:14
我可以把你的注意力从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
我还没有尝试过这个代码out...but,我想像这样的东西可能会起作用。让我知道它是否有帮助。
https://stackoverflow.com/questions/58453690
复制