Colorindo uma imagem com uma paleta de cores HSI

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 de cores HSI 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.

# -*- coding: utf-8 -*-
"""
@author: Rafael Zottesso
"""

import numpy as np
import cv2

# Função para gerar a peleta de cores com um início e fim de cor
def gerar_paleta(inicio, fim, sv):

	# Função: np.linspace(A, B, X)
	# Descrição: gera um vetor com X valores entre A e B.
	h = np.linspace(inicio, fim, 256)
	s = np.linspace(sv, sv, 256)
	i = np.linspace(sv, sv, 256)
	    
	# Função: a.reshape(alt, largura)
	# Descrição: Da uma nova forma a uma lista. Neste caso, criamos uma altura de 256 e 1 de largura
	# Função: np.tile(array, X)
	# Descrição: Repete um array X vezes. Aqui, repetindo o mesmo valor no eixo da largura para ficar com 256 de largura    
	p1 = np.tile( h.reshape(256,1), 256 )
	p2 = np.tile( s.reshape(256,1), 256 )
	p3 = np.tile( i.reshape(256,1), 256 )
	   
	# Função: np.uint8(num)
	# Descrição: converter números para 8 bits
	p1 = np.uint8(p1)
	p2 = np.uint8(p2)
	p3 = np.uint8(p3)
	    
	# Função: np.dstack( (v1, v2) )
	# Descrição: Faz a concatenação dos dois vetores, por exemplo.
	paleta = np.dstack( (np.dstack( (p1,p2) ), p3) )
	        
	return paleta

# Gera a paleta de cores considerando que o HSI está sendo usado
paleta = gerar_paleta(120, 240, sv=200)

# imread ( nome da imagem, [1=cor, 0=grayscape, -1=alpha])
# Cada coluna da imagem é armazenada em um subvetor, onde cada coluna é uma posição
img = cv2.imread('./Imagens/original.jpg', 0)

# Cria uma matriz com o mesmo tamanho da imagem cinza, mas com 3 dimensões
img_colorida = np.zeros( (img.shape[0], img.shape[1], 3) )

# Como a peleta possui as mesmas cores RGB no eixo da largura, podemos sempre pegar a posição 0
# 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
for i in range(img.shape[0]):
    for j in range(img.shape[1]):
    	# na posição zero porque todas as camadas são iguais
        img_colorida[i][j] = paleta [ img[i][j] ][0]

# Converte a imagem colorida pra 8 bits
img_colorida = np.uint8(img_colorida)

# Transforma pra RGB
paleta = cv2.cvtColor(paleta, cv2.COLOR_HSV2BGR)
img_colorida = cv2.cvtColor(img_colorida, cv2.COLOR_HSV2BGR)
# Mostra a imagem e salva ela
# nome da janela, matriz
cv2.imshow('Original',img)

cv2.imshow('Paleta',paleta)
cv2.imwrite('./Imagens/paleta_hsi.jpg', paleta)

cv2.imshow('Colorida',img_colorida)
cv2.imwrite('./Imagens/original_hsi.jpg', img_colorida)


# Código para manter a jenala com a imagem
cv2.waitKey(0)
cv2.destroyAllWindows()

 

Imagens Resultantes

# Imagem original

original

# Paleta HSI

paleta_hsi

# Imagem colorida

original_hsi

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

# -*- coding: utf-8 -*-
import numpy as np
import cv2

# Função para gerar a peleta de cores com um início e fim de cor definida pelo usuário
def gerar_paleta( b1, g1, r1, b2, g2, r2):
    
    # Função: np.linspace(A, B, X)
    # Descrição: gera um vetor com X valores entre A e B.
    b = np.linspace(b1, b2, 256)
    g = np.linspace(g1, g2, 256)
    r = np.linspace(r1, r2, 256)
        
    # Função: a.reshape(alt, largura)
    # Descrição: Da uma nova forma a uma lista. Neste caso, criamos uma altura de 256 e 1 de largura
    # Função: np.tile(array, X)
    # Descrição: Repete um array X vezes. Aqui, repetindo o mesmo valor no eixo da largura para ficar com 256 de largura    
    p1 = np.tile( b.reshape(256,1), 256 )
    p2 = np.tile( g.reshape(256,1), 256 )
    p3 = np.tile( r.reshape(256,1), 256 )
       
    # Função: np.uint8(num)
    # Descrição: converter números para 8 bits
    p1 = np.uint8(p1)
    p2 = np.uint8(p2)
    p3 = np.uint8(p3)
        
    # Função: np.dstack( (v1, v2) )
    # Descrição: Faz a concatenação dos dois vetores, por exemplo.
    paleta = np.dstack( (np.dstack( (p1,p2) ), p3) )
            
    return paleta
    # Fim da função

# Definindo uma cor inicial
b1 = 79
g1 = 79
r1 = 47
# Definindo uma cor final
b2 = 134
g2 = 230
r2 = 240

# Gerando uma paleta de cores da inicial até a final    
paleta = gerar_paleta(b1, g1, r1, b2, g2, r2)

# Abrir a imagem original em tons de cinza, por isso o parâmetro 0
img = cv2.imread('./Imagens/original.jpg', 0)

# Criar uma nova matriz com o mesmo tamanho que a imagem, porém com uma terceira dimensão para armazenar as cores BGR
# Função: np.zeros ( (x,y,z) , dtype=np.int8/16/32/... )
# img.shape[0] = altura, 1 = largura, 2 = profundidade, etc (conforme existir)
img_colorida = np.zeros( (img.shape[0], img.shape[1], 3) )

# Como a peleta possui as mesmas cores RGB no eixo da largura, podemos sempre pegar a posição 0
# 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
for i in range(img.shape[0]):
    for j in range(img.shape[1]):
        img_colorida[i][j] = paleta [ img[i][j] ][0]

# Converte os números da matriz para 8 bits
img_colorida = np.uint8(img_colorida)

# Mostrar uma imagem
cv2.imshow('Paleta de cores', paleta)
cv2.imshow('Imagem Original', img)
cv2.imshow('Imagem resultante', img_colorida)

# Funções para o funcionamento correto do python no Windows.
cv2.waitKey(0)
cv2.destroyAllWindows()

Imagens resultantes

# Paleta

paleta

# Original (tons de cinza)

original

# Colorida

colorida