2014-11-14 232 views
1

我有我彼此非常簡單地減去兩個圖像:現在防止信息丟失

Mat foo, a, b; 
...//imread onto a and b or somesuch 
foo = a - b; 

,據我瞭解,進入進底片(或超過255的任何像素值這件事)將被設置爲零。如果是這樣,我想知道是否有任何方法允許它在零以下,以便我可以稍後調整圖像而不會丟失信息。

如果簡化了事情,我正在處理灰度圖像。

+2

你可以使用'CV :: absDiff'功能,也可以轉換爲符號的數據類型(如'CV_16S'),並得到負值了。 – Micka 2014-11-14 16:22:33

+0

聽起來不錯。我如何從8UC1更改爲16SC1(例如)並返回?或者我可以使用imwrite()而不將墊子轉換回CV_8UC1?如果是這樣,當我使用imwrite時負值會發生什麼?儘管我可能會先調整圖像。 – 2014-11-18 13:53:32

+0

嘗試'yourMat.convertTo(...)'轉換爲其他類型。當轉換爲更有限的類型時,可以使用alpha和beta參數來適應類型限制,否則將使用飽和度投射。 http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-convertto您可以使用'imshow',並且afaik 0值對於簽名類型將顯示爲灰色。不知道你是否可以直接使用'imwrite',文檔說你只能使用'8U'和'16U'類型,如果它工作的話,可能會有一些不直觀的轉換/縮放/翻譯你的顏色。我很快就會寫出答案。 – Micka 2014-11-18 14:00:18

回答

1

這是怎樣一個簡單的轉換=>。減去=> convertAndScaleBack應用將如下所示:

輸入:

enter image description here

enter image description here

INT main()的 { cv :: Mat input = cv :: imread(「.. /inputData/Lenna.png「,CV_LOAD_IMAGE_GRAYSCALE); cv :: Mat input2 = cv :: imread(「../ inputData/Lenna_edges.png」,CV_LOAD_IMAGE_GRAYSCALE);

cv::Mat input1_16S; 
    cv::Mat input2_16S; 

    input.convertTo(input1_16S, CV_16SC1); 
    input2.convertTo(input2_16S, CV_16SC1); 

    // compute difference of 16 bit signed images 
    cv::Mat diffImage = input1_16S-input2_16S; 

    // now you have a 16S image that has some negative values 

    // find minimum and maximum values: 
    double min, max; 
    cv::minMaxLoc(diffImage, &min, &max); 
    std::cout << "min pixel value: " << min<< std::endl; 

    cv::Mat backConverted; 

    // scale the pixel values so that the smalles value is 0 and the largest one is 255 
    diffImage.convertTo(backConverted,CV_8UC1, 255.0/(max-min), -min); 

    cv::imshow("backConverted", backConverted);   
    cv::waitKey(0); 
} 

輸出:

enter image description here

+0

作爲參考,在轉換時默認使用的[saturate_cast](http://docs.opencv.org/modules/core/doc/utility_and_system_functions_and_macros.html#saturate-cast)的鏈接。 – 2014-11-18 15:55:54