撤消连续convertTo操作

时间:2016-11-23 08:25:45

标签: c++ opencv

将此应用于cv::Mat

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

如何实现相反的效果,以取回原始矩阵?

我尝试将scale参数降低到1以下,然后反转beta参数而不会产生预期的效果。 我想我错过了一些关于它们是如何工作的东西,但是找不到答案。

1 个答案:

答案 0 :(得分: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;
}