La ecualización de histograma no funciona en la imagen en color - OpenCV

La ecualización de histograma no funciona en la imagen en color - OpenCV

La ecualización del histograma es un proceso no lineal. La división de canales y la ecualización de cada canal por separado no es la forma correcta de ecualización del contraste. La ecualización implica intensidad valores de la imagen no los componentes de color. Entonces, para una imagen de color RGB simple, HE no debe aplicarse individualmente en cada canal. Más bien, debe aplicarse de manera que los valores de intensidad se igualen sin alterar el balance de color de la imagen. Entonces, el primer paso es convertir el espacio de color de la imagen de RGB en uno de los espacios de color que separan los valores de intensidad de los componentes de color. Algunos de estos son:

  • VHS/HLS
  • YUV
  • YCbCr

Convierta la imagen de RGB a uno de los espacios de color mencionados anteriormente. YCbCr se prefiere ya que está diseñado para digital imágenes Realice HE del plano de intensidad Y. Vuelva a convertir la imagen a RGB.

En tu situación actual, no estás observando ningún cambio significativo, porque solo hay 2 colores destacados en la imagen. Cuando hay muchos colores en la imagen, el método de división provocará un desequilibrio de color.

Como ejemplo, considere las siguientes imágenes:

Imagen de entrada

Ecualización de imagen de intensidad

Ecualización de canales individuales

(Observe los colores falsos)

Aquí está el código OpenCV para la ecualización del histograma de la imagen en color usando YCbCr espacio de color.

Mat equalizeIntensity(const Mat& inputImage)
{
    if(inputImage.channels() >= 3)
    {
        Mat ycrcb;

        cvtColor(inputImage,ycrcb,CV_BGR2YCrCb);

        vector<Mat> channels;
        split(ycrcb,channels);

        equalizeHist(channels[0], channels[0]);

        Mat result;
        merge(channels,ycrcb);

        cvtColor(ycrcb,result,CV_YCrCb2BGR);

        return result;
    }
    return Mat();
}

Y la versión de python, @sga:

import cv2
import os

def hisEqulColor(img):
    ycrcb=cv2.cvtColor(img,cv2.COLOR_BGR2YCR_CB)
    channels=cv2.split(ycrcb)
    print len(channels)
    cv2.equalizeHist(channels[0],channels[0])
    cv2.merge(channels,ycrcb)
    cv2.cvtColor(ycrcb,cv2.COLOR_YCR_CB2BGR,img)
    return img


fname='./your.jpg'
img=cv2.imread(fname)

cv2.imshow('img', img)
img2=hisEqulColor(img)
cv2.imshow('img2',img2)

Sin embargo, esto producirá ruido en la imagen (por ejemplo, la imagen de la izquierda a continuación)