Я написал код для сегментации водораздела в 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);
При звонке Mat::convertTo()
со скаляром (255
в вашем случае), значения каждого элемента матрицы будут умножены на это скалярное значение. Это приведет к тому, что все большинство значений каждого результирующего пикселя превысят 255 (то есть белые пиксели), за исключением значений 0, где они остаются равными 0 (то есть черным пикселям). Вот почему вы получите черно-белый пиксель в конце.
Чтобы заставить это работать, просто измените это на:
wshed.convertTo(img8bit, CV_32FC3);
Вы сказали:
Исходное изображение, которое я хочу сохранить, находится в wshed. Я видел предложения
из сети, что нам нужно преобразовать его в 16 бит или выше, чтобы
Имврит сохраняет это правильно.
Если сохранение изображения не работает, вы должны иметь в виду, что данные изображения должны быть 8-битными или 16-битный без знака при использовании imwrite
Функция, а не 16-бит или выше.
Это указано в документация:
Функция imwrite сохраняет изображение в указанном файле. Изображение
Формат выбирается на основе расширения имени файла (см. imread () для
список расширений). Только 8-битный (или 16-битный без знака (CV_16U) в случае
PNG, JPEG 2000 и TIFF) одноканальный или 3-канальный (с ‘BGR’
порядок каналов) изображения могут быть сохранены с помощью этой функции. Если формат,
глубина или порядок каналов другой, используйте Mat :: convertTo () и
cvtColor () чтобы конвертировать его перед сохранением. Или используйте универсальный
FileStorage I / O функции для сохранения изображения в формате XML или YAML.