OpenCV 中的 saturate_cast 如何工作?

inf*_*ged 3 opencv

无法理解,表达式 Vxy 和 Vxy_nocast 的结果

uchar init_m0[] = {10,10,30};
cv::Mat m0(3,1,CV_8UC1,init_m0,sizeof(uchar));
uchar& Vxy = m0.at<uchar>(0);
uchar& Vxy_nocast = m0.at<uchar>(1);
std::cout << m0 << std::endl;
Vxy = cv::saturate_cast<uchar>((Vxy-128)*2 + 128);
Vxy_nocast = (Vxy_nocast-128)*2 + 128;
std::cout << m0 << std::endl;
Run Code Online (Sandbox Code Playgroud)

结果

[ 10;
  10;
  30]
[  0;
 148;
  30]
Run Code Online (Sandbox Code Playgroud)

hcs*_*hcs 5

(10-128)*2 + 128 = -108. cv::saturate_cast<uchar>是对 unsigned char 的饱和转换,而 unsigned char 只能 >= 0。正常的 uchar 转换,如果您不指定任何内容,就会隐式发生的情况,将通过重新解释位将负值包装为正值,-108 是10010100在 2 的二进制补码中,它与 148 相同(它也会环绕更大的值,例如 257 到 1)。相反,饱和转换会将负值转换为 0,在该类型的最小值 0 处饱和(同样,正值将在最大值 255 处饱和)。

有关更多详细信息,请参阅饱和算法