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

标签 c++ opencv image-processing histogram histogram-equalization

我正在尝试使用以下函数使用 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();
}

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

抱歉图像质量不好,“预处理”(左)是直方图均衡,你可以看到它与输入相同(右)。

enter image description here

错过了什么?

最佳答案

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

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

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

例如,考虑以下图片:

输入图像

Input Image

强度图像均衡

Intensity Equalized

独立 channel 均衡

(注意假色)

Split Equalized

这是使用 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();
}

关于c++ - 直方图均衡不适用于彩色图像 - OpenCV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15007304/

相关文章:

python - 如何使用带有 GStreamer 后端的 OpenCV Python 创建 x264 RTSP 服务器

image-processing - 如何基于霍夫线在 OpenCV 中分割图像?

python - get_includes 找不到标准库头文件

c++ - 有没有工具可以记录Windows中每次内存分配的调用树?

opencv - 如何找到 OpenCV 类的定义?

python - 如何根据opencv python中的掩码删除图像组件?

opencv - pycharm-opencv中提取边缘像素数量

c++ - 如何使用 std::variant 保证复制省略?

c++ - 如何忽略函数模板中的常量?

c++ - 包含 opencv 的 Bitbake 配方