2016-01-12 5 views
0

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

это код: -

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.The img0 - это серое изображение/черно-белое, а изображение wshed окрашено. любая помощь по этому поводу?

Edit- Я изменил 4-ю строчку в

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

8 бит проще всего для записи/отображения изображения! И на самом деле в вашем коде вы не конвертируете в 16 бит, а конвертируете в float. – Micka

+3

'wshed.setTo (cv :: Scalar :: all (0));' делает все черным ... не так ли? – Mailerdaimon

+0

@ micka- pls покажите мне, как это сделать. –

ответ

0

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

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

wshed.convertTo(img8bit, CV_32FC3); 
0

Вы сказали:

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

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

Об этом говорится в documentation:

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

Смежные вопросы