Reputation: 1017
Let us consider a grayscale value with values in the range of [0, 255]. How can we efficiently map each value to a RGB value?
So far, I have come up with the following implementation:
# function for colorizing a label image:
def label_img_to_color(img):
label_to_color = {
0: [128, 64,128],
1: [244, 35,232],
2: [ 70, 70, 70],
3: [102,102,156],
4: [190,153,153],
5: [153,153,153],
6: [250,170, 30],
7: [220,220, 0],
8: [107,142, 35],
9: [152,251,152],
10: [ 70,130,180],
11: [220, 20, 60],
12: [255, 0, 0],
13: [ 0, 0,142],
14: [ 0, 0, 70],
15: [ 0, 60,100],
16: [ 0, 80,100],
17: [ 0, 0,230],
18: [119, 11, 32],
19: [81, 0, 81]
}
img_height, img_width = img.shape
img_color = np.zeros((img_height, img_width, 3))
for row in range(img_height):
for col in range(img_width):
label = img[row, col]
img_color[row, col] = np.array(label_to_color[label])
return img_color
However, as you can see it is not efficient as there are two "for" loops.
This question was also asked in Convert grayscale value to RGB representation?, but no efficient implementation was suggested.
Upvotes: 1
Views: 1929
Reputation: 3395
I wrote nearly the same question, and during question review I found @MattSt's answer. For posterity, here is the question I was about to ask:
How to convert a grayscale image to RGB one, given a pixel mapping function using NumPy?
I have a dictionary which maps labels to colors. But I don't know how to efficiently convert a 2D label map to 2D color image, using the provided mapping. This works:
label_to_color = {0: [0, 0, 0], 1: [255, 0, 0], 2: [0, 0, 255], 3: [0, 128, 0]}
def label_map_to_color(label_map):
color_map = np.empty(
(label_map.shape[0], label_map.shape[1], 3), dtype=np.uint8
)
for k in range(label_map.shape[0]):
for i in range(label_map.shape[1]):
color_map[k, i, :] = label_to_color[(label_map[k, i])]
return color_map
But there must be a more efficient way to accomplish this?
Upvotes: 0
Reputation: 1193
A more efficient way of doing that instead of a double for loop over all pixels could be:
rgb_img = np.zeros((*img.shape, 3))
for key in label_to_color.keys():
rgb_img[img == key] = label_to_color[key]
Upvotes: 3