OpenCV中的saturate操作(饱和操作)究竟是怎么回事?
OpenCV会对一些运算结果作饱和操作,那么什么是饱和操作呢?
用实际例子试一下就知道了。
我们用CV_8U类型来试下,CV_8U的数值范围大家都知道为0~255。
试验例子一:
[C++] 纯文本查看 复制代码
//出处:昊虹AI笔记网(hhai.cc)
//用心记录计算机视觉和AI技术
//博主微信/QQ 2487872782
//QQ群 271891601
//欢迎技术交流与咨询
//OpenCV版本 OpenCV3.0
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
int main()
{
cv::Mat A1(2, 3, CV_8UC1, cv::Scalar(254));
cout << "A1中的数据为:\n" << A1 << endl << endl;
cv::Mat B1(2, 3, CV_8UC1, cv::Scalar(2));
cout << "B1中的数据为:\n" << B1 << endl << endl;
cv::Mat C1;
cv::add(A1, B1, C1);
cout << "C1中的数据为:\n" << C1 << endl << endl;
return(0);
}
运行结果如下:
如果没有saturate操作(饱和操作),结果应该是256,但因为输出矩阵的类型也为CV_8U,而CV_8U的范围为0~255,所以值因为饱和操作被置为了255。
试验例子二:
[C++] 纯文本查看 复制代码
//出处:昊虹AI笔记网(hhai.cc)
//用心记录计算机视觉和AI技术
//博主微信/QQ 2487872782
//QQ群 271891601
//欢迎技术交流与咨询
//OpenCV版本 OpenCV3.0
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
int main()
{
cv::Mat A1(2, 3, CV_8UC1, cv::Scalar(254));
cout << "A1中的数据为:\n" << A1 << endl << endl;
cv::Mat B1(2, 3, CV_8UC1, cv::Scalar(2));
cout << "B1中的数据为:\n" << B1 << endl << endl;
cv::Mat C1;
cv::subtract(B1, A1, C1);
cout << "C1中的数据为:\n" << C1 << endl << endl;
return(0);
}
运行结果如下:
如果没有saturate操作(饱和操作),结果应该是-252,但因为输出矩阵的类型也为CV_8U,而CV_8U的范围为0~255,所以因为饱和操作被置为了0。
通过这两个例子,大家就应该理解知道了OpenCV中的saturate操作(饱和操作)究竟是怎么回事了吧。 |