直方图均衡不适用于彩色图像 - OpenCV

21 c++ opencv image-processing histogram

我正在尝试使用OpenCV使用以下函数执行直方图均衡

Mat Histogram::Equalization(const Mat& inputImage)
{
    if(inputImage.channels() >= 3)
    {
        vector<Mat> channels;
        split(inputImage,channels);
        Mat B,G,R;

        equalizeHist( channels[0], B );
        equalizeHist( channels[1], G );
        equalizeHist( channels[2], R );
        vector<Mat> combined;
        combined.push_back(B);
        combined.push_back(G);
        combined.push_back(R);
        Mat result;
        merge(combined,result);
        return result;
    }
    return Mat();
}
Run Code Online (Sandbox Code Playgroud)

但是当我得到结果时,输入和输出图像似乎没有区别,我做错了什么?

对不起图像质量不好,"预处理"(左)是直方图均衡,你可以看到它与输入相同(右).

在此输入图像描述

错过了什么?

sga*_*zvi 73

直方图均衡是一个非线性过程.分别对每个通道进行通道分割和均衡不是对比度均衡的正确方法.均衡涉及图像的强度值而不是颜色分量.因此,对于简单的RGB彩色图像,不应在每个通道上单独应用HE.相反,应该应用它以使强度值均衡而不干扰图像的色彩平衡.因此,第一步是将图像的颜色空间从RGB转换为将颜色分量与颜色分量分开的颜色空间之一.其中一些是:

将图像从RGB转换为上述颜色空间之一.YCbCr是首选,因为它是专为数字图像设计的.执行强度平面Y的HE.将图像转换回RGB.

在您目前的情况下,您没有观察到任何重大变化,因为图像中只有2种突出的颜色.当图像中有大量颜色时,分割方法会导致颜色不平衡.

例如,请考虑以下图像:

输入图像

输入图像

强度图像均衡

强度均衡

个别渠道均等化

(注意假色)

拆分均衡

这是使用YCbCr颜色空间进行彩色图像直方图均衡的OpenCV代码.

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();
}
Run Code Online (Sandbox Code Playgroud)

  • 美丽 - 这是最好的解决方案.我看到的其他所有内容都涉及操纵栅格数组.++++ 1 (3认同)
  • 谢谢:)会尝试一下! (2认同)

Ste*_* Du 9

而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)
Run Code Online (Sandbox Code Playgroud)

但是这会在图像中产生噪声(例如,左下图) 在此输入图像描述