Definindo uma paleta de cores e aplicando em uma imagem

Dada uma imagem em tons de cinza, a ideia é definir uma cor (inicial) para representar o preto e outra (final) para representar o branco. Em seguida, criar uma paleta que varia da cor inicial até a final e aplicar estas cores na imagem original.

Para realizar este trabalho, foram utilizados os pacotes NumPy e OpenCV. O código está todo comentado e no final do post é possível ver as imagens resultantes.

Código

01# -*- coding: utf-8 -*-
02import numpy as np
03import cv2
04 
05# Função para gerar a peleta de cores com um início e fim de cor definida pelo usuário
06def gerar_paleta( b1, g1, r1, b2, g2, r2):
07     
08    # Função: np.linspace(A, B, X)
09    # Descrição: gera um vetor com X valores entre A e B.
10    b = np.linspace(b1, b2, 256)
11    g = np.linspace(g1, g2, 256)
12    r = np.linspace(r1, r2, 256)
13         
14    # Função: a.reshape(alt, largura)
15    # Descrição: Da uma nova forma a uma lista. Neste caso, criamos uma altura de 256 e 1 de largura
16    # Função: np.tile(array, X)
17    # Descrição: Repete um array X vezes. Aqui, repetindo o mesmo valor no eixo da largura para ficar com 256 de largura   
18    p1 = np.tile( b.reshape(256,1), 256 )
19    p2 = np.tile( g.reshape(256,1), 256 )
20    p3 = np.tile( r.reshape(256,1), 256 )
21        
22    # Função: np.uint8(num)
23    # Descrição: converter números para 8 bits
24    p1 = np.uint8(p1)
25    p2 = np.uint8(p2)
26    p3 = np.uint8(p3)
27         
28    # Função: np.dstack( (v1, v2) )
29    # Descrição: Faz a concatenação dos dois vetores, por exemplo.
30    paleta = np.dstack( (np.dstack( (p1,p2) ), p3) )
31             
32    return paleta
33    # Fim da função
34 
35# Definindo uma cor inicial
36b1 = 79
37g1 = 79
38r1 = 47
39# Definindo uma cor final
40b2 = 134
41g2 = 230
42r2 = 240
43 
44# Gerando uma paleta de cores da inicial até a final   
45paleta = gerar_paleta(b1, g1, r1, b2, g2, r2)
46 
47# Abrir a imagem original em tons de cinza, por isso o parâmetro 0
48img = cv2.imread('./Imagens/original.jpg', 0)
49 
50# Criar uma nova matriz com o mesmo tamanho que a imagem, porém com uma terceira dimensão para armazenar as cores BGR
51# Função: np.zeros ( (x,y,z) , dtype=np.int8/16/32/... )
52# img.shape[0] = altura, 1 = largura, 2 = profundidade, etc (conforme existir)
53img_colorida = np.zeros( (img.shape[0], img.shape[1], 3) )
54 
55# Como a peleta possui as mesmas cores RGB no eixo da largura, podemos sempre pegar a posição 0
56# O for percorre a altura e a largura da nova matriz criada para representar a imagem colorida, e recebe a cor de acordo com a imagem original e o tom de cinza
57for i in range(img.shape[0]):
58    for j in range(img.shape[1]):
59        img_colorida[i][j] = paleta [ img[i][j] ][0]
60 
61# Converte os números da matriz para 8 bits
62img_colorida = np.uint8(img_colorida)
63 
64# Mostrar uma imagem
65cv2.imshow('Paleta de cores', paleta)
66cv2.imshow('Imagem Original', img)
67cv2.imshow('Imagem resultante', img_colorida)
68 
69# Funções para o funcionamento correto do python no Windows.
70cv2.waitKey(0)
71cv2.destroyAllWindows()

Imagens resultantes

# Paleta

paleta

# Original (tons de cinza)

original

# Colorida

colorida