2016-07-28 67 views
7

我正在使用TIF包含有符號整數數據的圖像。成功輸入並處理後,我需要以相同的格式輸出圖像(輸入和輸出* .tif文件)。使用OpenCV保存整數CV_32S圖像

對於輸入,我知道OpenCV不知道數據是有符號還是無符號的,所以它假定沒有簽名。使用this trick解決了這個問題(手動切換cv::Mat的類型)。

但是,當我輸出圖像並重新加載時,我沒有得到預期的結果。該文件包含多個段(像素組),並且格式如下(我必須使用此格式):具有值-9999

  • 所有像素

    • 所有像素不屬於任何段屬於單個段具有相同的正整數值
    • (例如第一分段的所有像素具有值1,第二2等)

    這裏是EXA多個代碼:

    void ImageProcessor::saveSegments(const std::string &filename){ 
        cv::Mat segmentation = cv::Mat(workingImage.size().height, 
                workingImage.size().width, 
                CV_32S, cv::Scalar(-9999)); 
    
        for (int i=0, szi = segmentsInput.size(); i < szi; ++i){ 
         for (int j=0, szj = segmentsInput[i].size(); j < szj; ++j){ 
          segmentation.at<int>(segmentsInput[i][j].Y, 
               ssegmentsInput[i][j].X) = i+1; 
         } 
        } 
        cv::imwrite(filename, segmentation); 
    } 
    

    您可以假設所有變量(例如, workingImage,segmentsInput)作爲全局變量存在。

    使用此代碼,當我輸入圖像和檢查值時,大部分值設置爲0而設置的那些採用整個範圍的整數值(在我的例子中我有20段)。

  • +0

    你保存矩陣的格式是什麼? JPEG? – Sunreef

    +0

    @Sunreef正如我在我原來的問題中所說的那樣,它全是TIF格式 – penelope

    +0

    你不能直接用imwrite保存整數矩陣。正如文檔所述:「只有8位(或16位無符號(CV_16U),PNG,JPEG 2000和TIFF)單通道或3通道(具有'BGR'通道順序)圖像可以使用這個功能。「 – Sunreef

    回答

    1

    你不能直接用imwrite保存整數矩陣。由於the documentation規定:「只有8位(或16位無符號(CV_16U),PNG,JPEG 2000和TIFF)單通道或3通道(具有'BGR'通道順序)圖像可以使用此保存功能。」

    但是,你可以做些什麼來將CV_32S矩陣轉換爲CV_8UC4並將其保存爲不壓縮的PNG格式。當然,這是有點不安全的,因爲endianness開始發揮作用,並且可能會改變您在不同系統或編譯器之間的值(特別是因爲我們在這裏討論的是帶符號整數)。如果你總是使用相同的系統和編譯器,您可以使用此:

    cv::Mat segmentation = cv::Mat(workingImage.size().height, 
               workingImage.size().width, 
               CV_32S, cv::Scalar(-9999)); 
    cv::Mat pngSegmentation(segmentation.rows, segmentation.cols, CV_8UC4, (cv::Vec4b*)segmentation.data); 
    std::vector<int> params; 
    params.push_back(CV_IMWRITE_PNG_COMPRESSION); 
    params.push_back(0); 
    cv::imwrite("segmentation.png", pngSegmentation, params); 
    
    +0

    Tyvm,我會給它一個看看它是如何工作的,但是,因爲這些文件應該可用還有其他軟件(例如,生成原始TIF文件的軟件),我想我可能需要在最後解決不同的格式。 – penelope

    +0

    如果您使用TIFF圖像,16位矩陣是不夠的?你可以用imwrite保存這些文件。@penelope – Sunreef

    +0

    @Sunreef你的意思是說,在其他系統中保存的圖像可以看作是損壞的文件嗎? –

    0

    我也OpenCV的墊保存爲TIFS但我不`噸使用OpenCV的TIF解決方案。我有我自己的(我認爲的libtiff也OpenCV中使用)和比你可以使用下面的代碼保存爲TIFF

    TIFF* tif = TIFFOpen("file.tif", "w"); 
    
         if (tif != NULL) { 
          for (int i = 0; i < pages; i++) 
          { 
           TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, TIFF_UINT64_T(x)); // set the width of the image        
           TIFFSetField(tif, TIFFTAG_IMAGELENGTH, TIFF_UINT64_T(y)); // set the height of the image       
           TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1); // set number of channels per pixel 
           TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 32); // set the size of the channels 32 for CV_32F         
           TIFFSetField(tif, TIFFTAG_PAGENUMBER, i, pages); 
           TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP); // for CV32_F 
    
           for (uint32 row = 0; row < y; row++) 
           { 
            TIFFWriteScanline(tif, &imageDataStack[i].data[row*x*32/ 8], row, 0); 
           } 
           TIFFWriteDirectory(tif); 
          } 
         } 
    

    imageDataStack是CV ::墊物體的向量中的libtiff庫。此代碼適用於我保存TIFF堆棧。