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
# Paleta HSI
# Imagem colorida
Não entendi uma coisa amigo. Se vc está trabalhando para colorir uma imagem usando a paleta HSI, porque vc usa HSV ao aplicar cv2.cvtColor com cv2.COLOR_HSV2BGR?
HSV e HSI são paletas distintas!
A OpenCV não tem implementação para a paleta HSI.
Teria como você explicar sua técnica?