Я пытаюсь загрузить и отобразить изображение .PGM, используя OpenCV (2.4.0) для C ++.
void open(char* location, int flag, int windowFlag)
{
Mat image = imread(location, flag);
namedWindow("Image window", windowFlag);
imshow("Image window", image);
waitKey(0);
}
Я звоню открыто так:
open("./img_00245_c1.pgm", IMREAD_UNCHANGED, CV_WINDOW_AUTOSIZE);
Проблема в том, что изображение, отображаемое при открытии окна, темнее, чем если бы я открывал файл с помощью IrfanView.
Также, если я пытаюсь записать это изображение в другой файл, как это:
Mat imgWrite;
imgWrite = image;
imwrite("newImage.pgm", imgWrite)
Я получу содержимое файла, отличное от исходного, и IrfanView отобразит его, когда моя функция отобразится в imshow.
Есть ли в imread другой флаг для файлов .PGM, чтобы я мог получить исходный файл для отображения и сохранения?
РЕДАКТИРОВАТЬ: Образ файл pgm
РЕДАКТИРОВАТЬ 2: Отмечено, что: IrfanView нормализует изображение до максимального значения в пикселях 255.
Для того, чтобы ясно видеть изображение с помощью OpenCV, я должен нормализовать изображение также при загрузке в Mat. Возможно ли это напрямую с помощью функций OpenCV без перебора пикселей и изменения их значений?
Проблема не в том, как данные нагруженный, но так, как они отображается.
Ваше изображение CV_16UC1
и оба imshow
а также imwrite
нормализовать значения из исходного диапазона [0, 65535]
к диапазону [0, 255]
чтобы соответствовать диапазону типа CV_8U
,
Так как ваше изображение PGM имеет max_value
из 4096
:
P2
1176 640 // width height
4096 // max_value
это должно быть нормализовано из диапазона [0, 4096]
вместо [0, 65535]
,
Вы можете сделать это с:
Mat img = imread("path_to_image", IMREAD_UNCHANGED);
img.convertTo(img, CV_8U, 255.0 / 4096.0);
imshow("Image", img);
waitKey();
Обратите внимание, что диапазон значений в вашем изображении не соответствует [0, 4096]
, но:
double minv, maxv;
minMaxLoc(img, &minv, &maxv);
// minv = 198
// maxv = 2414
Так что простая нормализация в [0,255]
лайк:
normalize(img, img, 0, 255, NORM_MINMAX);
img.convertTo(img, CV_8U);
не будет работать, так как будет производить изображение ярче чем это должно быть.
Это означает, что правильно шоу ваше изображение вам нужно знать max_value
(Вот 4096
). Если он меняется каждый раз, вы можете получить его, анализируя .pgm
файл.
Опять же, это просто проблема с визуализация. Данные верны.
Других решений пока нет …