Equalização de histograma CLAHE – OpenCV
A equalização do histograma é uma técnica usada no processamento de imagens para melhorar o contraste de uma imagem, redistribuindo as intensidades dos pixels de uma forma que maximiza o brilho e os detalhes gerais. O método funciona ajustando a distribuição de frequência dos valores dos pixels em uma imagem, de forma que a imagem resultante tenha um histograma uniforme. O histograma uniforme garante que cada pixel da imagem tenha chances iguais de aparecer, resultando em uma imagem bem distribuída com contraste aprimorado.
A equalização do histograma é uma ferramenta importante no processamento de imagens e é comumente usada em diversas aplicações, incluindo imagens médicas, sensoriamento remoto e visão computacional. A técnica é particularmente útil para aprimorar imagens que apresentam baixo contraste ou brilho, como aquelas capturadas em condições de pouca luz ou superexpostas.
A equalização do histograma é uma ferramenta importante no processamento de imagens e é comumente usada em diversas aplicações, incluindo imagens médicas, sensoriamento remoto e visão computacional. A técnica é particularmente útil para aprimorar imagens que apresentam baixo contraste ou brilho, como aquelas capturadas em condições de pouca luz ou superexpostas.
Apesar de sua eficácia na melhoria do contraste da imagem, a equalização do histograma pode levar a alguns artefatos na imagem resultante, como amplificação excessiva de ruído e perda de detalhes. Portanto, diversas variações e melhorias do método foram desenvolvidas ao longo dos anos, como equalização adaptativa do histograma, equalização adaptativa do histograma com contraste limitado e equalização local do histograma, entre outras.
Agora vamos entender um pouco sobre o CLAHE.
CLAHE
Contrast Limited Adaptive Histogram Equalization (CLAHE) é uma variante da equalização de histograma que tem sido amplamente utilizada em aplicações de processamento de imagem para melhorar o contraste da imagem, evitando a amplificação excessiva de ruído e preservando os detalhes da imagem. A ideia principal por trás do CLAHE é realizar a equalização do histograma localmente, em regiões menores da imagem, em vez de globalmente.
Na equalização de histograma tradicional, a imagem é dividida em pequenas regiões ou subimagens não sobrepostas, e cada subimagem é equalizada individualmente. Este processo pode resultar na amplificação excessiva do ruído nas subimagens com baixo contraste, levando a uma imagem ruidosa e de aparência artificial. Em contraste, o CLAHE divide a imagem em regiões sobrepostas e aplica a equalização do histograma a cada região separadamente. Isto permite um melhor aprimoramento do contraste, preservando os detalhes locais e evitando a amplificação excessiva do ruído.
CLAHE envolve duas etapas principais: aumento de contraste e limitação do contraste. Na primeira etapa, uma equalização de histograma local é aplicada a cada pequena região da imagem, resultando em maior contraste. Na segunda etapa, o contraste da imagem é limitado aplicando uma função não linear ao histograma, de modo que o número de pixels com intensidades muito altas ou muito baixas seja reduzido. A função não linear é definida por um parâmetro chamado limite de corte, que determina a quantidade de limitação de contraste a ser aplicada.
O limite do clipe é um parâmetro importante no CLAHE. Determina a quantidade máxima de amplificação de contraste que pode ser realizada em cada região antes que o contraste seja limitado. Se o limite de corte for definido muito alto, a imagem poderá ficar excessivamente aprimorada e sofrer efeitos de aparência artificial, como halos ao redor das bordas ou uma aparência geral desbotada. Por outro lado, se o limite do clipe for definido muito baixo, o aprimoramento do contraste poderá não ser suficiente e a imagem poderá parecer opaca.
CLAHE tem diversas vantagens sobre a equalização de histograma tradicional. Primeiro, pode preservar detalhes locais e aumentar o contraste de forma mais eficaz. Em segundo lugar, pode evitar a amplificação excessiva do ruído, o que é particularmente importante em aplicações de imagens médicas, onde as imagens podem apresentar ruído. Finalmente, é um algoritmo simples e computacionalmente eficiente, tornando-o adequado para aplicações em tempo real.
Concluindo, CLAHE é uma técnica poderosa para melhorar o contraste da imagem, preservando os detalhes locais e evitando a amplificação excessiva do ruído. Tem sido amplamente utilizado em diversas aplicações, incluindo imagens médicas, sensoriamento remoto e visão computacional. Sua capacidade de se adaptar às variações locais de contraste e evitar a amplificação excessiva de ruído o torna uma ferramenta valiosa para aprimorar imagens em muitos campos.
Este tutorial demonstrará o processo de uso do Contrast Limited Adaptive Histogram Equalization (CLAHE) para equalizar imagens.
O contraste das imagens pode ser melhorado usando este algoritmo. Além disso, o CLAHE pode ser aplicado a imagens coloridas, com melhores resultados obtidos ao aplicar o algoritmo apenas ao canal de luminância de uma imagem HSV, em vez de equalizar todos os canais de uma imagem BGR.
Ao usar o CLAHE, é importante ter em mente dois parâmetros: o clipLimit e o tileGridSize.
O clipLimit define o limite para limitação de contraste e tem um valor padrão de 40. Enquanto isso, o tileGridSize determina o número de blocos em cada linha e coluna ao dividir a imagem para o aplicativo CLAHE, e seu valor padrão é 8x8.
Agora chega de teoria, vamos explorar como podemos usar o CLAHE para fazer a equalização do histograma.
Antes de entrarmos no código, primeiro precisamos ter certeza de que o módulo opencv está instalado em nossa máquina e, caso contrário, precisamos executar o comando mostrado abaixo.
Comando
pip3 install opencv-python
Considere o código mostrado abaixo.
Exemplo
import cv2
import numpy as np
# Reading the image from the present directory
image = cv2.imread("aircraft-ww2.jpeg")
# Resizing the image for compatibility
image = cv2.resize(image, (500, 600))
# The initial processing of the image
# image = cv2.medianBlur(image, 3)
image_bw = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# The declaration of CLAHE
# clipLimit -> Threshold for contrast limiting
clahe = cv2.createCLAHE(clipLimit = 5)
final_img = clahe.apply(image_bw) + 30
# Ordinary thresholding the same image
_, ordinary_img = cv2.threshold(image_bw, 155, 255, cv2.THRESH_BINARY)
# Showing all the three images
cv2.imshow("ordinary threshold", ordinary_img)
cv2.imshow("CLAHE image", final_img)
cv2.waitKey()
Explicação
Este código executa uma tarefa simples de processamento de imagem usando a biblioteca OpenCV em Python.
Primeiro, importa as bibliotecas necessárias: OpenCV e NumPy. Em seguida, ele lê uma imagem chamada "aircraft-ww2.jpeg" do diretório atual e a redimensiona para 500x600 para compatibilidade.
A seguir, a imagem é convertida em tons de cinza usando a função cv2.cvtColor(). A variável image_bw resultante armazena a imagem em tons de cinza.
Posteriormente, o código aplica Contrast Limited Adaptive Histogram Equalization (CLAHE) à imagem em tons de cinza usando a função cv2.createCLAHE(). O parâmetro clipLimit é definido como 5, o que determina o limite para limitação de contraste. A imagem resultante é então ajustada adicionando um valor de 30 para aumentar seu brilho.
Além da imagem CLAHE, o código também executa limiarização comum na imagem em tons de cinza usando a função cv2.threshold(). O valor limite é definido como 155, o que significa que qualquer valor de pixel acima de 155 será definido como 255 (branco) e qualquer valor abaixo de 155 será definido como 0 (preto). A imagem resultante é armazenada na variável ordinária_img.
Finalmente, o código exibe todas as três imagens usando a função cv2.imshow(), com "limiar comum" representando a imagem de limite comum e "imagem CLAHE" representando a imagem aprimorada por CLAHE. O código aguarda o pressionamento de uma tecla antes de fechar as janelas usando cv2.waitKey().
Para executar o código acima, precisamos executar o comando mostrado abaixo.
Comando
python3 main.py
Depois de executar o comando acima, podemos esperar que a saída seja igual à mostrada abaixo.
Saída
À esquerda temos a imagem original sem o clahe, e a imagem da direita é aquela onde utilizamos o CLAHE.
Agora vamos usar mais um exemplo.
Onde mudaremos cliplimit e titleGridSize.
Considere o código mostrado abaixo.
Exemplo
import cv2
import numpy as np
# Reading the image from the present directory
image = cv2.imread("aircraft-ww2.jpeg")
# Resizing the image for compatibility
image = cv2.resize(image, (500, 600))
# The initial processing of the image
# Uncomment the line below to apply median filtering
# image = cv2.medianBlur(image, 3)
image_bw = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# The declaration of CLAHE
# clipLimit -> Threshold for contrast limiting
# tileGridSize -> Number of tiles in the row and column
clahe = cv2.createCLAHE(clipLimit=10, tileGridSize=(8, 8))
final_img = clahe.apply(image_bw)
# Adjust the brightness of the output
final_img = cv2.add(final_img, 50)
# Showing all the three images
cv2.imshow("Original image", image)
cv2.imshow("CLAHE image", final_img)
cv2.waitKey()
Explicação
Primeiro, importamos as bibliotecas necessárias, OpenCV e NumPy.
Em seguida, lemos uma imagem chamada "aircraft−ww2.jpeg" do diretório atual usando a função cv2.imread() e a armazenamos na variável 'image'. Redimensionamos a imagem para 500 x 600 pixels para garantir compatibilidade com a janela de exibição.
A seguir, convertemos a imagem em tons de cinza usando a função cv2.cvtColor() e armazenamos em uma nova variável chamada 'image_bw'.
Em seguida, criamos um objeto Contrast Limited Adaptive Histogram Equalization (CLAHE) usando a função cv2.createCLAHE(). Definimos o parâmetro 'clipLimit' como 10, que define o limite para limitação de contraste, e o parâmetro 'tileGridSize' como (8,8), que define o número de blocos na linha e na coluna.
Em seguida, aplicamos o algoritmo CLAHE à imagem em tons de cinza usando o método apply() do objeto CLAHE e armazenamos o resultado em uma nova variável chamada 'final_img'.
Finalmente, ajustamos o brilho da imagem de saída adicionando um valor de 50 à variável ‘final_img’ usando a função cv2.add(). Exibimos a imagem original e a imagem aprimorada por CLAHE lado a lado usando a função cv2.imshow() e aguardamos o pressionamento de uma tecla usando a função cv2.waitKey().
Para executar o código acima, precisamos executar o comando mostrado abaixo.
Comando
python3 main.py
Depois de executar o comando acima, podemos esperar que a saída seja igual à mostrada abaixo.
Saída
Conclusão
Concluindo, a Equalização de histograma adaptativo limitado por contraste (CLAHE) é uma técnica poderosa de aprimoramento de imagem que pode melhorar o contraste e a faixa dinâmica de uma imagem.
Com a ajuda do OpenCV, é fácil implementar CLAHE em imagens coloridas e em tons de cinza. Ajustando os parâmetros clipLimit e tileGridSize, podemos ajustar o desempenho do algoritmo CLAHE para atender às nossas necessidades. No geral, CLAHE é uma ferramenta útil no processamento de imagens e pode ajudar a melhorar a qualidade visual das imagens em diversas aplicações.