我有我彼此非常簡單地減去兩個圖像:現在防止信息丟失
Mat foo, a, b;
...//imread onto a and b or somesuch
foo = a - b;
,據我瞭解,進入進底片(或超過255的任何像素值這件事)將被設置爲零。如果是這樣,我想知道是否有任何方法允許它在零以下,以便我可以稍後調整圖像而不會丟失信息。
如果簡化了事情,我正在處理灰度圖像。
我有我彼此非常簡單地減去兩個圖像:現在防止信息丟失
Mat foo, a, b;
...//imread onto a and b or somesuch
foo = a - b;
,據我瞭解,進入進底片(或超過255的任何像素值這件事)將被設置爲零。如果是這樣,我想知道是否有任何方法允許它在零以下,以便我可以稍後調整圖像而不會丟失信息。
如果簡化了事情,我正在處理灰度圖像。
這是怎樣一個簡單的轉換=>。減去=> convertAndScaleBack應用將如下所示:
輸入:
和
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);
}
輸出:
作爲參考,在轉換時默認使用的[saturate_cast](http://docs.opencv.org/modules/core/doc/utility_and_system_functions_and_macros.html#saturate-cast)的鏈接。 – 2014-11-18 15:55:54
你可以使用'CV :: absDiff'功能,也可以轉換爲符號的數據類型(如'CV_16S'),並得到負值了。 – Micka 2014-11-14 16:22:33
聽起來不錯。我如何從8UC1更改爲16SC1(例如)並返回?或者我可以使用imwrite()而不將墊子轉換回CV_8UC1?如果是這樣,當我使用imwrite時負值會發生什麼?儘管我可能會先調整圖像。 – 2014-11-18 13:53:32
嘗試'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