Equalização por Histograma

Imagens capturadas com iluminação inadequada é baste comum. As técnicas de processamento de imagem usada para realizar correções  é conhecida como realce.

Existem várias técnicas de realce. Algumas são bem complexas e tem custo computacional elevado, essas são destinadas a melhorar qualidade de imagens. Outras são mais simples e rápida voltada para correção em pre-processamento, a equalização por histograma é uma da mais usada nesse caso.

Um histograma indica a quantidade de pixels em cada um dos níveis da escala da imagem.

import matplotlib.pyplot as plt

dados=np.array([1,2,2,3,4,5,5])
plt.title("Histograma")
plt.ylabel("Frequência")
plt.xlabel("Amostra")
plt.hist(dados)
plt.show()

Olhando para o histograma, podemos facilmente identificar que o valor 1 aparece apenas uma vez na amostra, já o valor 2 aparece duas vezes. Assim, o histograma mostrará a frequência que os valores aparecem, isso tem algumas implicações importantes.

O contraste de uma imagem é a diferença entre as cores. Ou seja, quanto mais distribuída as cores melhor o contraste. Ao contrário, se houver uma concentração então temos uma imagem com contaste ruim. 

A correção de contraste altera a iluminância da imagem. Logo devemos aplicar a equalização em uma imagem de intensidade (escala de cinza), ou converter uma imagem colorida para um espaço que a iluminância esteja em um canal separada, como no espaço HSV.

No OpenCV temos algumas opções para realizar a equalização de uma imagem, vamos começar pela mais simples, cv2.equalizeHist.

  • Calcula o histograma.
  • Normaliza, de modo que a soma seja no máximo 255.
  • Calcula a integral do histograma.
import cv2
img_bgr= cv2.imread("jetson.jpg")
img_hsv=cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)

img_hsv[:, :, 2]=cv2.equalizeHist(img_hsv[:, :, 2])# aplica equalização no canal V

saida=cv2.cvtColor(img_hsv, cv2.COLOR_HSV2BGR)
concat=cv2.hconcat((img_bgr,saida))
cv2.imwrite("equalizeHist.jpg",concat)

A função cv2.equalizeHist considera o contraste global da imagem, O nome na caixa “jetson nano” quase desapareceu, de fato não temos muito controle sobre esse processo. Não se preocupe, o OpenCV tem a solução.

Equalização adaptiva

A ideia por trás da equalização adaptiva é dividirmos a imagem em parte a aplicar a equalização local.

clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img_hsv[:, :, 2])

Se aplicarmos a equalização em bloco isolados da imagem, podemos obter variações entre os blocos o que causaria manchas na imagem. O clipLimit é justamente para evitar isso, ele define o limite máximo do contraste em um bloco. Ou seja, quanto menor clipLimit mais uniforme é a equalização, porém menos adaptiva.

O tileGridSize define o total de blocos em linha e colunas que a imagem será dividida.

Normalmente a equalização é aplicada na etapa de pre-processamento. Para análise em vídeo isso significa que vamos gastar nosso precioso tempo do loop principal para aplicar a equalização a cada frame.

Como esperado equalizeHist é 2,5 vezes mais rápido do que clache 8×8. Entretanto, ha um detalhe importante, a imagem de entrada tem 1700X2250 de resolução, isso é divisível por 10 mais resulta em valor quebrado quando dividimos por 8. Logo será necessario executar ajustes para cortar a imagem.

Só a mudança de 8×8 para 10×10 temos um ganho de velocidade de 1,4 vezes.

Mudar cilpLimit ou a quantidade de blocos não produz impacto significativo em velocidade de execução.

Conclusão

Os dois métodos apresentados aqui para realizar equalização são bem similares. O equalizeHist não permite fazer alteração no processo, porém é mais rápido que o clahe. Já o clache consegue adaptar em diferentes situações onde o equalizeHist não produziria bons resultados.

Meus parabéns por chegar até aqui. Agora você está apito para utilizar equalização por histograma de foma eficiente em suas aplicações. Se gostou desse post ou tem alguma dúvida deixe-me saber nos comentários.

3 Replies to “Equalização por Histograma”

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *