将其应用于cv::Mat

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

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

我尝试将scale参数降低到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;
}

关于c++ - 撤消连续的convertTo操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40759286/

10-11 16:31