2015-11-20 236 views
2

我正在嘗試使用OpenCV(2.4.0)爲C++加載和顯示.PGM圖像。如何使用OpenCV顯示PGM圖像

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 for .PGM文件中是否有不同的標誌,以便我可以獲取要顯示和保存的原始文件?

編輯:圖片pgm file

編輯2:指出,:IrfanView的規格化圖像255的最大象素值。 爲了使用OpenCV清晰地看到圖像,我應該在Mat中加載時也對圖像進行標準化。這是否可以直接使用OpenCV函數,而無需遍歷像素並修改其值?

+1

也許Irfanview的自動正常化,即對比度拉伸你的形象和OpenCV是不是...也許嘗試節省Irfanview的歸一化的,對比度拉伸圖像和裝載到這OpenCV的,或者對比度拉伸顯示它之前OpenCV中的黑暗歲月。 –

+1

也許你可以找到答案[這裏(看看兼容性)](http://netpbm.sourceforge.net/doc/pgm.html)。你能給你的PGM文件的鏈接? – sturkmen

+0

我已經添加了照片的鏈接! –

回答

1

問題不在於數據是加載,但他們的方式是顯示

你的圖像是CV_16UC1,並且兩個imshowimwrite從原始範圍[0, 65535]標準化值的範圍[0, 255]以適合類型CV_8U的範圍內。

由於您的PGM形象max_value4096的:

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文件。

再次,它只是一個可視化問題。數據是正確的。