将其应用于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/