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

OpenCV EqualizeHist() creates black and white image from colour image

本文关键字:创建 黑白 图像 彩色图像 EqualizeHist OpenCV      更新时间:2023-10-16

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

我在代码中使用的逻辑与这里描述的逻辑相同,但结果是我得到了一个奇怪的黑白图像,请参阅原始图像和结果。我在Visual Studio 2017 15.8.8中使用带有C++的OpenCV 4.0.0。以前的声明:

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

其中file_path是std::字符串。均衡:

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);
}

我对您的代码编译感到惊讶。您使用的逻辑很好,但您编码的指针(*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);