2017-05-30 33 views
0

我想在OpenCVC++)上將JPG圖像讀爲CV_16UC1如何將JPG圖像讀取爲CV_16UC1並在屏幕上打印?

我也可以從CV_8UC3轉換爲CV_16UC1

下面這段代碼的工作,但在這裏它僅使用CV_8UC3格式,這是不是我所需要:

using namespace cv; 
int main() 
{ 
    Mat im1 = imread("MyPic.JPG"); 
    Mat im2 = imread("MyPic.JPG"); 
    Size sz1 = im1.size(); 
    Size sz2 = im2.size(); 

    Mat final(sz1.height, sz1.width + sz2.width, CV_8UC3); 
    Mat left(final, Rect(0, 0, sz1.width, sz1.height)); 
    im1.copyTo(left); 

    Mat right(final, Rect(sz1.width, 0, sz2.width, sz2.height)); 
    im2.copyTo(right); 

    imshow("final", final); 
    waitKey(0); 
    return 0; 
} 

但我需要使用CV_16UC1(這是真的必要!)。因此,我已經轉換是這樣的:

cv::Mat im2 = cv::imread("MyPic.jpg"); 
    cv::Size sz2 = im2.size(); 

    cv::Mat im3; // I want im3 to be the CV_16UC1 of im2 
    im2.convertTo(im3, CV_16UC1); 
    cv::Size sz3 = im3.size(); 

    cv::Mat im1 = cv::imread("MyPic.jpg"); 
    cv::Size sz1 = im1.size(); 

    cv::Mat im4; 
    im4.convertTo(im1, CV_16UC1); 
    cv::Size sz4 = im4.size(); 

    // Two images by each other side - this must be CV_16UC1 
    cv::Mat final(sz1.height, sz1.width + sz2.width, CV_16UC1); 

    // The left image 
    cv::Mat left(final, cv::Rect(0, 0, sz1.width, sz1.height)); 
    im1.copyTo(left); 

    // The right image 
    cv::Mat right(final, cv::Rect(sz1.width, 0, sz2.width, sz2.height)); 
    im4.copyTo(right); 

    cv::imshow("final", final); 

    cv::waitKey(0); 

看來我做錯事的convertions還是我讀的方式,因爲沒有圖像出現在屏幕上。

如何正確地從CV_8UC3轉換爲CV_16UC1

+1

您可以退後一步,也許可以解釋*爲什麼*您認爲您需要從8位JPEG製作16位圖像?可能有其他選擇可以更好地滿足您的需求。 –

回答

1

8位無符號Mat的像素值範圍在0到255之間,因此,當您從文件加載圖像並顯示它們時,每個像素在距離255(最大值)越近時越亮。

將這些圖像轉換爲16Bit-Unsigned後,像素將保持相同的絕對值(介於0和255之間),但現在數據結構的最大值爲65535.所以,這並不奇怪圖像是黑暗的。即使更高的值(255)在新分辨率下仍然會很低,以至於看起來不存在。

「如何將JPG圖像讀取爲CV_16UC1並在屏幕上打印?」

你不行。 .jpg圖像不是CV_16UC1。如果你生成了這些圖像,並認爲他們會保存16Bit的數據,他們不會。可能你沒有正確保存它。一旦他們是.jpg,他們就會失去大部分信息,並且沒有任何神奇的方法來恢復它。

+0

這個答案確實值得鏈接到['convertTo'](http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat-convertto)和['imshow']( http://docs.opencv.org/2.4/modules/highgui/doc/user_interface.html#imshow),以及來自後者的這個基本句子的引用,它解釋了當你試圖顯示一個16位圖像時會發生什麼。 ;)所有的提示都在那裏,爲什麼沒有那麼多人閱讀它... –

+0

謝謝@Pedro Batista。有沒有什麼辦法可以將圖像保存爲u16類型呢? – waas1919

+1

@ waas1919您可以使用opencv FileStorage對象http://docs.opencv.org/3.2.0/da/d56/classcv_1_1FileStorage.html保存它們。或者,您可以使用C++ fstream將原始數據直接保存到文件中。 –

相關問題