如何将图像从像素转换为一次性编码?

时间:2019-08-16 01:52:19

标签: python tensorflow

我有一个正在使用Tensorflow加载的PNG图片:

image = tf.io.decode_png(tf.io.read_file(path), channels=3)

图像包含与如下所示的查找相匹配的像素:

image_colors = [
    (0, 0, 0),        # black
    (0.5, 0.5, 0.5),  # grey
    (1, 0.5, 1),      # pink
]

如何转换它,以使输出将像素映射为单热编码,而热成分将是匹配颜色?

2 个答案:

答案 0 :(得分:5)

为了方便起见,我假设image_colors中的所有值都在[0, 255]中:

image_colors = [
    (0, 0, 0),  # black
    (127, 127, 127),  # grey
    (255, 127, 255),  # pink
]

我的方法将像素映射为一个热值,如下所示:

# Create a "color reference" tensor from image_colors
color_reference = tf.cast(tf.constant(image_colors), dtype=tf.uint8)

# Load the image and obtain tensor with one-hot values
image = tf.io.decode_png(tf.io.read_file(path), channels=3)
comp = tf.equal(image[..., None, :], color_reference)
one_hot = tf.cast(tf.reduce_all(comp, axis=-1), dtype=tf.float32)

请注意,您可以轻松地向image_colors添加新颜色,而无需更改TF实现。同样,这假设image中的所有像素都在image_colors中。如果不是这种情况,则可以为每种颜色定义一个范围,然后使用其他tf.math操作(例如tf.greatertf.less)代替tf.equal

答案 1 :(得分:2)

可能有比这更好的方法。

def map_colors(pixel):
    if pixel[0] < 10 and pixel[1] < 10 and pixel[2] < 10:   ## Black
        return 0
    elif pixel[0] > 245 and pixel[1] > 245 and pixel[2] > 245:  ## White
        return 1
    else:
        return 11


image = tf.io.decode_png(tf.io.read_file(path), channels=3)
img_shape = image.shape
# Arrange the pixels in RGB format from 3D array to 2D array.
image = tf.reshape(image, [-1, 3])

colors = tf.map_fn(lambda x: map_colors(x), image)
one_hot = tf.one_hot(colors, depth=12)
print(one_hot)

# If necessary
image_one_hot = tf.reshape(one_hot, [img_shape[0], img_shape[1], 12])

确保在map_colors中,将所有12种颜色放入它们可以接受的RGB颜色值范围内。确保覆盖所有组合,否则,添加以上都不是的额外类并将其命名为12。