OpenCV EqualizeHist() 从彩色图像创建黑白图像

Posted

技术标签:

【中文标题】OpenCV EqualizeHist() 从彩色图像创建黑白图像【英文标题】:OpenCV EqualizeHist() creates black and white image from colour image 【发布时间】:2018-11-03 22:22:45 【问题描述】:

编辑: 指针/引用的使用可能是错误的,但是如果任何 cv::Mat 变量在均衡块之外声明(在我的情况下,在它们所属的类的定义中),也会发生这种 OpenCV 行为。 em>

我在我的代码中使用了与here 中描述的逻辑相同的逻辑,但结果却得到了一张奇怪的黑白图像,请参阅original 和result。我在 Visual Studio 2017 15.8.8 中使用 OpenCV 4.0.0 和 C++。以前的声明:

cv::Mat *equalized_image;
cv::Mat &original_image = cv::Mat(cv::imread(file_path));

其中 file_path 是一个 std::string。均衡:

if (original_image.channels() >= 3) 
    // convert to YCrCb colourspace for luminance channel
    cv::cvtColor(original_image, *equalized_image, cv::COLOR_BGR2YCrCb);

    // split image by channels
    std::vector<cv::Mat> channels;
    cv::split(*equalized_image, channels);

    // equalize only the histogram of the luminance channel
    cv::equalizeHist(channels[0], channels[0]);

    // merge back
    cv::merge(channels, *equalized_image);

    // convert back to BGR colourspace
    cv::Mat result;
    cv::cvtColor(*equalized_image, result, cv::COLOR_YCrCb2BGR);

    cv::namedWindow("Equalized");
    cv::imshow("Equalized", result);

【问题讨论】:

cv::Mat &amp;original_image = cv::Mat(cv::imread(file_path)); -- 哎呀,这不是您在实际代码中所拥有的,是吗? (您正在对临时对象进行非常量引用) 【参考方案1】:

我很惊讶您的代码可以编译。您使用的逻辑很好,但是您编写的指针 (*equalized_image) 和引用 (&original_image) 令人困惑。如果您在发布模式下运行,它可以做一些有趣的事情来初始化内存并使事情正常工作。始终首先在调试模式下检查您的代码。

将您的代码更改为此,它应该可以按预期工作:

cv::Mat equalized_image;
cv::Mat original_image = cv::imread(file_path);

// convert to YCrCb colourspace for luminance channel
cv::cvtColor(original_image, equalized_image, cv::COLOR_BGR2YCrCb);

// split image by channels
std::vector<cv::Mat> channels;
cv::split(equalized_image, channels);

// equalize only the histogram of the luminance channel
cv::equalizeHist(channels[0], channels[0]);

// merge back
cv::merge(channels, equalized_image);

// convert back to BGR colourspace
cv::Mat result;
cv::cvtColor(equalized_image, result, cv::COLOR_YCrCb2BGR);

cv::namedWindow("Equalized");
cv::imshow("Equalized", result);
waitKey(0);

【讨论】:

以上是关于OpenCV EqualizeHist() 从彩色图像创建黑白图像的主要内容,如果未能解决你的问题,请参考以下文章

python使用OpenCV加载彩色图像并把图像转化为YUV格式的彩色图使用equalizeHist算法增强彩色图像的对比度可视化对比度增强之后的彩色图像

opencv —— equalizeHist 直方图均衡化

使用 cv::equalizeHist() 的 OpenCV 直方图均衡过程:需要帮助理解最后一步

利用OpenCV的函数equalizeHist()对图像作直方图均衡化处理

python使用openCV图像加载(转化为灰度图像)使用equalizeHist算法增强灰度图像对比度可视化对比度增强之后的图像

OpenCV-实现直方图均衡化(对比cv::equalizeHist)