1
當將其應用到一個cv::Mat
撤消consecutives的ConvertTo操作
original.convertTo(new_image, -1, 1.2, -10);
我如何能實現相反的效果,找回我原來的矩陣?
我試過降低1以下的比例參數,並且反轉beta參數而沒有得到想要的效果。 我想我錯過了一些關於它們是如何工作的,但找不到答案。
當將其應用到一個cv::Mat
撤消consecutives的ConvertTo操作
original.convertTo(new_image, -1, 1.2, -10);
我如何能實現相反的效果,找回我原來的矩陣?
我試過降低1以下的比例參數,並且反轉beta參數而沒有得到想要的效果。 我想我錯過了一些關於它們是如何工作的,但找不到答案。
的convertTo
功能計算:
new_image = original * alpha + beta
new_image = original * 1.2 + (-10)
要獲得反向操作,您需要:
old_image = (new_image - beta)/alpha;
old_image = (new_image - (-10))/1.2;
請注,結果可能是saturated_cast<>
「版,以適應矩陣型。在這種情況下,操作不可逆併產生與原始圖像不同的圖像。這很可能發生在CV_8U
矩陣上,但不是CV_64F
矩陣。
這是一個簡單的片段,以展示它是如何工作:
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat original = ...
double alpha = 1.2;
double beta = -10.0;
Mat new_image;
original.convertTo(new_image, -1, alpha, beta);
// // Revert the 'convertTo'
Mat old_image;
old_image = (new_image - beta)/alpha;
// Check the difference
Mat diff;
absdiff(original, old_image, diff);
return 0;
}
謝謝回答!我確實錯過了convertTo的工作原理。儘管如此,我並沒有通過應用這個來獲得確切的原始圖像。我的undo'd奇怪有點比原來暗。任何想法 ? –
是的,當你使用'convertTo'時,有一個'saturated_cast <>'涉及到。這意味着,例如,如果你有一個'CV_8UC1'圖像(值爲[0,255]'),那麼每個超過255的值都將達到255.所以當你轉換回來時,結果會變得更暗。看看我的回答中的「請注意...」部分 – Miki
哦,我明白了,我一開始並不理解這一點。現在更清楚了!所以,除了記住以前的圖像之外,我沒有其他選擇,這是一種恥辱,但完全是邏輯,當這個飽和點被理解時。再次感謝 ! –