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

РЕДАКТИРОВАТЬ:
Использование указателя / ссылки может быть неправильным, но такое поведение 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

Решение

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

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector