Как отобразить изображение PGM с помощью OpenCV

Я пытаюсь загрузить и отобразить изображение .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 без перебора пикселей и изменения их значений?

3

Решение

Проблема не в том, как данные нагруженный, но так, как они отображается.

Ваше изображение 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 файл.

Опять же, это просто проблема с визуализация. Данные верны.

1

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

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

По вопросам рекламы [email protected]