OpenCV EqualizeHist () создает черно-белое изображение из цветного изображения - PullRequest
0 голосов
/ 04 ноября 2018

EDIT:
Использование указателя / ссылки может быть неправильным, но такое поведение OpenCV также происходит, если какие-либо переменные cv :: Mat объявлены вне блока выравнивания (в моем случае, в определении класса, членами которого они являются).

Я использую ту же логику в моем коде, что и описанную здесь , но в результате получаю странное черно-белое изображение, см. оригинал и результат . Я использую OpenCV 4.0.0 с C ++ в Visual Studio 2017 15.8.8. Предыдущие декларации:

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

1 Ответ

0 голосов
/ 04 ноября 2018

Я удивлен, что ваш код компилируется. Логика, которую вы используете, хороша, но указатели (* 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);
...