2016-11-23 55 views
1

當將其應用到一個cv::Mat撤消consecutives的ConvertTo操作

original.convertTo(new_image, -1, 1.2, -10); 

我如何能實現相反的效果,找回我原來的矩陣?

我試過降低1以下的比例參數,並且反轉beta參數而沒有得到想要的效果。 我想我錯過了一些關於它們是如何工作的,但找不到答案。

回答

1

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; 
} 
+0

謝謝回答!我確實錯過了convertTo的工作原理。儘管如此,我並沒有通過應用這個來獲得確切的原始圖像。我的undo'd奇怪有點比原來暗。任何想法 ? –

+1

是的,當你使用'convertTo'時,有一個'saturated_cast <>'涉及到。這意味着,例如,如果你有一個'CV_8UC1'圖像(值爲[0,255]'),那麼每個超過255的值都將達到255.所以當你轉換回來時,結果會變得更暗。看看我的回答中的「請注意...」部分 – Miki

+0

哦,我明白了,我一開始並不理解這一點。現在更清楚了!所以,除了記住以前的圖像之外,我沒有其他選擇,這是一種恥辱,但完全是邏輯,當這個飽和點被理解時。再次感謝 ! –