我已经在CelebA-Mask-HQ数据集(https://github.com/switchablenorms/CelebAMask-HQ上训练了一个面部分割模型,该模型能够为背景,眼睛,面部,头发,等等。该模型会生成一个形状为(1024,1024,3)的numpy数组。输出的分割图有点嘈杂,例如,脸上的一些随机像素被标记为眼睛,或者当它实际上是背景时弹出了布料标签,请参见下图:
如您在图像中看到的,在左上角看到绿色像素,在胡须周围的脸部看到绿色像素(在黄色上唇图上方)。
我想通过更改图像中这些错误标记的小片段(由较大的正确标记的区域包围)自动将其更改为该区域中最主要的颜色(具有可调整的窗口),从而从分割图中删除此“噪声”尺寸)。我找不到内置的opencv功能。您是否知道执行此操作的任何有效方法(我需要对大量图像进行“去噪”,所以理想情况下是采用仅矢量化的numpy方式)?
非常重要的是,去噪后的图像仅包含一组预定义的标签颜色(总共19种不同的颜色),因此需要以绝对的方式对噪声进行重新着色而不进行平均(这会为该颜色引入新的颜色)图片的调色板)。
谢谢!
答案 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
我还没有尝试过此代码...但是我认为类似的方法可能有效。让我知道它是否有帮助。