OpenCV中的saturate操作(饱和操作)究竟是怎么回事

Posted 昊虹图像算法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV中的saturate操作(饱和操作)究竟是怎么回事相关的知识,希望对你有一定的参考价值。

OpenCV中的saturate操作(饱和操作)究竟是怎么回事?

用两个实际例子试一下就知道了。

我们用CV_8U类型来试下,CV_8U的范围为0~255

第一个例子:

//OpenCV版本:3.0.0
//VS版本:2013

//博主微信/QQ 2487872782
//有问题可以联系博主交流
//有图像处理开发需求也请联系博主
//图像处理技术交流QQ群 271891601

#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);

运行结果如下:

按道理,结果应该是256,但因为输出矩阵的类型也为CV_8U,而CV_8U的范围为0~255,所以值被置为了255。

第二个例子:

//OpenCV版本:3.0.0
//VS版本:2013

#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);

运行结果如下:

按道理,结果应该是-252,但因为输出矩阵的类型也为CV_8U,而CV_8U的范围为0~255,所以值被置为了0。
通过这两个例子,大家就应该理解知道了OpenCV中的saturate操作(饱和操作)究竟是怎么回事了吧。

以上是关于OpenCV中的saturate操作(饱和操作)究竟是怎么回事的主要内容,如果未能解决你的问题,请参考以下文章

Python的Numpy库的函数astype()在将大范围数据类型转换为小范围数据类型时并不是做饱和(saturate)操作(附实现饱和操作的方法)

饱和操作和模操作

opencv基础篇3讲-色彩空间转换&像素运算&ROI与泛洪填充

论文笔记---Deblurring Shaken and Partially Saturated Images

详解OpenCV的函数cv::add(),并附各种情况的示例代码和运行结果

30opencv入门轮廓查找与绘制——轮廓特征属性及应用