2013-03-08 174 views
3

我使用OpenCV來讀取圖像。然後我使用Matlab來加載相同的圖像。 然後我顯示圖像。對於OpenCV加載的圖像,圖像內部沒有圖像,只有灰色平面。對於Matlab加載的圖像,它具有我想要的圖像。 圖像像素值是非常小的浮點數據,如0.0021。我用來加載圖像的代碼如下所示。OpenCV和浮點數據閱讀圖像

`Mat image(IMAGE_ROW, IMAGE_COL, CV_64FC3); 
Mat gray(IMAGE_ROW, IMAGE_COL, CV_64FC1); 
image = imread(filespath, CV_LOAD_IMAGE_COLOR);// Read the file 
cv::imshow("Image", image); 
cvtColor(image, gray, CV_BGR2GRAY, 1); 
cv::imshow("gray", gray);` 

爲什麼我不能像加載Matlab一樣的圖像?

回答

5

好吧,你不能用imwrite()/ imread(),如前所述。

,但你可以保存/載入浮動使用FileStorage點墊,就像這樣:

Mat fm = Mat::ones(3,3,CV_32FC3); // dummy data 

FileStorage fs("my.yml", FileStorage::WRITE); 
fs << "mat1" << fm; //choose any key here, just be consistant with the one below 

和回讀:

Mat fm; 
FileStorage fs("my.yml", FileStorage::READ); 
fs["mat1"] >> fm; 
+0

我需要加載myimage.jpg,因爲我所有的圖像都是以jpg格式捕捉的。然後圖像像素值是非常小的浮點數,如0.00123,0.00245等。什麼是直接從JPG文件加載這些圖像的最佳方式。正如你所建議的,我們可以在Matlab中加載jpg,然後保存爲yml。然後再次在OpenCV中加載。但是有沒有......我可以調整,以便我可以直接從OpenCV加載這樣的圖像? – Bryanyan 2013-03-09 08:05:22

+0

哦,等等,以上都是opencv代碼,不是matlab。而且你不能將浮點圖像存儲在jpg或png中。這不是opencv的限制,而是文件格式 – berak 2013-03-09 08:10:45

+0

是的我知道上面的代碼是用於opencv的。我懂了。我怎樣才能通過你我的JPG文件?如果你有時間,你可以從opencv加載測試。當我在Matlab中讀取該jpg文件時,我收到了一個具有小像素值的圖像緩衝區。然後在OpenCv中,只是收到一個灰色的圖像。 – Bryanyan 2013-03-09 08:26:58

2

在調用cv::imread之前,您不需要明確地初始化cv::Mat圖像,它會根據讀取圖像的大小和格式正確地初始化圖像。因此,您使用(IMAGE_ROW, IMAGE_COL, CV_64FC3)初始化圖像並不重要。

OpenCV沒有寫/讀浮點圖像的功能。從cv::imwrite手冊:

只有8位(或PNG,JPEG 2000和TIFF的情況下16位) 單聲道或3聲道(與「BGR」信道的順序)圖像可以是 使用此功能保存。

+0

你的意思是沒有辦法來加載與浮點數據OpneCV形象? – Bryanyan 2013-03-08 08:57:28

+0

是的。因爲沒有能夠存儲浮點值的廣泛圖像格式。除HDR外。 – Mikhail 2013-03-08 09:25:30

+0

@Mikhail除了'tiff'或'jpeg'。 Libtiff實際上可以做到這一點,這些圖像通常用於遙感和視頻遊戲紋理。像ImageJ和Matlab這樣的程序可以打開它們。在這一天結束的時候這是OpenCV人員的遺漏。 – Mikhail 2014-09-15 04:00:45

0

試過@berak解決方案,但有一個「失蹤,元素之間「的例外。如this錯誤報告中所述,您必須在寫入操作後釋放FileStorage對象,否則將無法正確完成文件寫入並因此引發該異常。然後,小碼的修正版本應該是:

Mat fm = Mat::ones(3,3,CV_32FC3); // dummy data 
FileStorage fs("my.yml", FileStorage::WRITE); 
fs << "mat1" << fm; //choose any key here, just be consistant with the one below 
fs.release(); //Release the file and finish the writing. 
1

可以加載浮動圖片的OpenCV與Mat img= imread(filename, CV_LOAD_IMAGE_ANYDEPTH);