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 -*- |
02 | import numpy as np |
03 | import cv2 |
04 |
05 | # Função para gerar a peleta de cores com um início e fim de cor definida pelo usuário |
06 | def 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 |
36 | b1 = 79 |
37 | g1 = 79 |
38 | r1 = 47 |
39 | # Definindo uma cor final |
40 | b2 = 134 |
41 | g2 = 230 |
42 | r2 = 240 |
43 |
44 | # Gerando uma paleta de cores da inicial até a final |
45 | paleta = gerar_paleta(b1, g1, r1, b2, g2, r2) |
46 |
47 | # Abrir a imagem original em tons de cinza, por isso o parâmetro 0 |
48 | img = 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) |
53 | img_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 |
57 | for 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 |
62 | img_colorida = np.uint8(img_colorida) |
63 |
64 | # Mostrar uma imagem |
65 | cv2.imshow( 'Paleta de cores' , paleta) |
66 | cv2.imshow( 'Imagem Original' , img) |
67 | cv2.imshow( 'Imagem resultante' , img_colorida) |
68 |
69 | # Funções para o funcionamento correto do python no Windows. |
70 | cv2.waitKey( 0 ) |
71 | cv2.destroyAllWindows() |
Imagens resultantes
# Paleta
# Original (tons de cinza)
# Colorida