2016-11-23 92 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

哦,我明白了,我一开始并不理解这一点。现在更清楚了!所以,除了记住以前的图像之外,我没有其他选择,这是一种耻辱,但完全是逻辑,当这个饱和点被理解时。再次感谢 ! –