【发布时间】:2016-12-23 05:49:19
【问题描述】:
假设有 600 个带注释的语义分割掩码图像,其中包含 10 种不同的颜色,每种颜色代表一个实体。这些图像是一个 numpy 形状数组 (600, 3, 72, 96),其中 n = 600, 3 = RGB 通道,72 = 高度,96 = 宽度。
如何将 numpy 数组中的每个 RGB 像素映射到颜色索引值?例如,颜色列表将是 [(128, 128, 0), (240, 128, 0), ...n],并且 numpy 数组中的所有 (240, 128, 0) 像素都将转换为索引唯一映射中的值 (= 1)。
如何用更少的代码高效地做到这一点?这是我想出的一种解决方案,但速度很慢。
# Input imgs.shape = (N, 3, H, W), where (N = count, W = width, H = height)
def unique_map_pixels(imgs):
original_shape = imgs.shape
# imgs.shape = (N, H, W, 3)
imgs = imgs.transpose(0, 2, 3, 1)
# tupleview.shape = (N, H, W, 1); contains tuples [(R, G, B), (R, G, B)]
tupleview = imgs.reshape(-1, 3).view(imgs.dtype.descr * imgs.shape[3])
# get unique pixel values in images, [(R, G, B), ...]
uniques = list(np.unique(tupleview))
# map uniques into hashed list ({"RXBXG": 0, "RXBXG": 1}, ...)
uniqmap = {}
idx = 0
for x in uniques:
uniqmap["%sX%sX%s" % (x[0], x[1], x[2])] = idx
idx = idx + 1
if idx >= np.iinfo(np.uint16).max:
raise Exception("Can handle only %s distinct colors" % np.iinfo(np.uint16).max)
# imgs1d.shape = (N), contains RGB tuples
imgs1d = tupleview.reshape(np.prod(tupleview.shape))
# imgsmapped.shape = (N), contains uniques-index values
imgsmapped = np.empty((len(imgs1d))).astype(np.uint16)
# map each pixel into unique-pixel-ID
idx = 0
for x in imgs1d:
str = ("%sX%sX%s" % (x[0], x[1] ,x[2]))
imgsmapped[idx] = uniqmap[str]
idx = idx + 1
imgsmapped.shape = (original_shape[0], original_shape[2], original_shape[3]) # (N, H, W)
return (imgsmapped, uniques)
测试它:
import numpy as np
n = 30
pixelvalues = (np.random.rand(10)*255).astype(np.uint8)
images = np.random.choice(pixelvalues, (n, 3, 72, 96))
(mapped, pixelmap) = unique_map_pixels(images)
assert len(pixelmap) == mapped.max()+1
assert mapped.shape == (len(images), images.shape[2], images.shape[3])
assert pixelmap[mapped[int(n*0.5)][60][81]][0] == images[int(n*0.5)][0][60][81]
print("Done: %s" % list(mapped.shape))
【问题讨论】:
-
嗯。你为什么要这样做?似乎只是无缘无故地增加了一个步骤。如果你想对这些颜色索引做任何事情,你将不得不搜索字典并将它们转换回 RGB 元组,不是吗?编辑:没关系,我明白了。如果您要存储一堆图像,那么存储整数而不是一组元组会更有效,因为无论如何您都预计会有一定数量的颜色 (10),对吗?
-
是的,颜色数量是有限的。需要唯一索引,因为我将像素提供给用于预测像素类别而不是像素颜色的算法。灰度图像(强度例如 0-10)也可以,但是图像不容易通过标准工具(= 图像查看器、编辑器等)可视化。最后,经过预测,需要映射回RGB值,是的。
标签: python image performance numpy image-processing