1
当将其应用到一个cv::Mat
撤消consecutives的ConvertTo操作
original.convertTo(new_image, -1, 1.2, -10);
我如何能实现相反的效果,找回我原来的矩阵?
我试过降低1以下的比例参数,并且反转beta参数而没有得到想要的效果。 我想我错过了一些关于它们是如何工作的,但找不到答案。
当将其应用到一个cv::Mat
撤消consecutives的ConvertTo操作
original.convertTo(new_image, -1, 1.2, -10);
我如何能实现相反的效果,找回我原来的矩阵?
我试过降低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;
}
谢谢回答!我确实错过了convertTo的工作原理。尽管如此,我并没有通过应用这个来获得确切的原始图像。我的undo'd奇怪有点比原来暗。任何想法 ? –
是的,当你使用'convertTo'时,有一个'saturated_cast <>'涉及到。这意味着,例如,如果你有一个'CV_8UC1'图像(值为[0,255]'),那么每个超过255的值都将达到255.所以当你转换回来时,结果会变得更暗。看看我的回答中的“请注意...”部分 – Miki
哦,我明白了,我一开始并不理解这一点。现在更清楚了!所以,除了记住以前的图像之外,我没有其他选择,这是一种耻辱,但完全是逻辑,当这个饱和点被理解时。再次感谢 ! –