用于清除 RGB 地面真值分割掩码的最近邻插值,Python Numpy

Nearest neighbor interpolation for cleansing RGB ground truth segmentation mask, Python Numpy

我使用 unity 生成了一个合成语义图像分割数据集。我注意到我使用的着色器似乎在某些情况下沿边界对 classes 的像素值进行了平均。例如下面第一张图片是unity生成的输入X,第二张图片是unity生成的我的Y。问题是像素值在 class 之间取平均值。第三张图片是一个掩码,其中白色值在掩码值的关键集中找不到,灰色值在关键集中。

我总共有 6 个 class,所以它不只是分配给一个 class 那么简单。我的问题是是否知道基于最近的有效邻居填充这些值的有效方法?

这是我的相关代码

ix = k.preprocessing.image.load_img(os.path.join(self.x_path,imgFile))
ix = k.preprocessing.image.img_to_array(ix)

iy = k.preprocessing.image.load_img(os.path.join(self.y_path,imgFile))
iy = k.preprocessing.image.img_to_array(iy)

#encode all of the RGB values to a class number
for mask_val, enc in self.dataSet.mask2class_encoding.items():
    iy[np.all(iy==mask_val,axis=2)] = enc


#there were some that didnt encode and so I found that unity averages rgb values along class edge
foobarMask = None
for mask_val in self.dataSet.mask2class_encoding:
    if foobarMask is None:
        foobarMask = np.any(iy[:,:]!=mask_val,axis=2)
    else:
        foobarMask = np.logical_and(foobarMask,np.any(iy[:,:]!=mask_val,axis=2))


#mask2class_encoding{(255, 0, 0): 0, (45, 45, 45): 1, (255, 90, 0): 2, (0, 0, 255): 3, (111, 63, 12): 4, (255, 255, 0): 5}

现在我基本上想根据掩码进行某种最近邻插值,但我有点不知道如何做?非常感谢任何帮助。如果有办法首先阻止统一着色器执行此操作,则加分!

事实证明这很简单

indices = nd.distance_transform_edt(foobarMask, return_distances=False, return_indices=True)
iy = iy[tuple(indices)]