我有一个正在使用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
]
如何转换它,以使输出将像素映射为单热编码,而热成分将是匹配颜色?
答案 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.greater
和tf.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。