imwrite в opencv дает черно-белое изображение

Я написал код для сегментации водораздела в C API. Теперь я конвертирую все это в C++. Итак, cvsaveimage становится неотличимым. Но когда я использую imwrite, я получаю только черное изображение.

это код:-

Mat img8bit;
Mat img0;
img0 = imread("source.png", 1);           
Mat wshed(img0.size(), CV_32S);
wshed.setTo(cv::Scalar::all(0));
////after performing watershed segmentation and
        // displaying the watershed image from wshed//
wshed.convertTo(img8bit, CV_32FC3, 255.0);
imwrite("Watershed.png", img8bit);

Исходное изображение, которое я хочу сохранить, находится в wshed. Я видел предложения из сети, что нам нужно преобразовать его в 16 бит или выше, чтобы imwrite сохранил его правильно. Как видите, я попробовал это. Но wshed-изображение отображается правильно при использовании imshow. Img0 - серое / черно-белое изображение, а wshed - цветное. любая помощь по этому поводу?

Edit- я изменил 4-ю строку на

Mat wshed(img0.size(), CV_32FC3);

2 ответа

При звонке Mat::convertTo() со скаляром (255 в вашем случае), значения каждого элемента матрицы будут умножены на это скалярное значение. Это приведет к тому, что все большинство значений каждого результирующего пикселя превысят 255 (т. Е. Белые пиксели), за исключением значений 0, где они остаются равными 0 (т. Е. Черные пиксели). Вот почему вы получите черно-белый пиксель в конце.

Чтобы заставить это работать, просто измените это на:

wshed.convertTo(img8bit, CV_32FC3);

Вы сказали:

Исходное изображение, которое я хочу сохранить, находится в wshed. Я видел предложения из сети, что нам нужно преобразовать его в 16 бит или выше, чтобы imwrite сохранил его правильно.

Если сохранение изображения не работает, вы должны иметь в виду, что данные изображения должны быть 8-битными или 16-битными без знака при использовании imwrite Функция, а не 16-бит или выше.

Об этом говорится в документации:

Функция imwrite сохраняет изображение в указанном файле. Формат изображения выбирается на основе расширения имени файла (список расширений см. В imread()). С помощью этой функции можно сохранить только 8-битные (или 16-битные без знака (CV_16U) в случае PNG, JPEG 2000 и TIFF) одноканальные или 3-канальные (с порядком каналов 'BGR') изображения. Если формат, глубина или порядок каналов отличаются, используйте Mat::convertTo() и cvtColor() для преобразования перед сохранением. Или используйте универсальные функции ввода-вывода FileStorage, чтобы сохранить изображение в формате XML или YAML.

Другие вопросы по тегам