Majid Azimi
Majid Azimi

Reputation: 1017

map grayscale values to RGB values in image

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

Answers (2)

Dženan
Dženan

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

MattSt
MattSt

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

Related Questions