OpenCV saturate_cast<uchar>函数用法(饱和剔除)(像素限制溢出滤除像素设限防溢出)

Posted Dontla

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV saturate_cast<uchar>函数用法(饱和剔除)(像素限制溢出滤除像素设限防溢出)相关的知识,希望对你有一定的参考价值。

saturate_cast<uchar>主要是为了防止颜色溢出操作

原理大致如下
if(data<0) 
        data=0; 
elseif(data>255) 
    data=255;

具体用法:
原图:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;

int main(int argc, const char* argv[]) 

	Mat src, dst1, dst2;
	src = imread("./test.jpg");
	//if (src.empty()) 
	if (!src.data)
		printf("could not load image...\\n");
		return -1;
	
	namedWindow("input img");	//默认自动窗口大小
	imshow("input img", src);

	dst1 = Mat::zeros(src.size(), src.type());	//第二个参数是位深度,目前值为16
	dst2 = Mat::zeros(src.size(), src.type());

	//三个for循环,执行运算 g_dstImage(i,j) =a*g_srcImage(i,j) + b
	for (int y = 0; y < src.rows; y++)
	
		for (int x = 0; x < src.cols; x++)
		
			for (int c = 0; c < 3; c++)	//三个通道
			
				dst1.at<Vec3b>(y, x)[c] = src.at<Vec3b>(y, x)[c] * 2;	//不饱和滤除
				dst2.at<Vec3b>(y, x)[c] = saturate_cast<uchar>(src.at<Vec3b>(y, x)[c] * 2);	//饱和滤除
			
			
		
	


	namedWindow("output img1");	//默认自动窗口大小
	namedWindow("output img2");
	imshow("output img1", dst1);
	imshow("output img2", dst2);

	waitKey(0);
	return 0;

编译运行结果:

代码中把每个像素点对应每个通道的值都翻了两倍,上面是没经过饱和剔除的,下面的是经过饱和剔除的

参考文章1:【OpenCV】中saturate_cast<uchar>的含义和用法是什么?

以上是关于OpenCV saturate_cast<uchar>函数用法(饱和剔除)(像素限制溢出滤除像素设限防溢出)的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV函数convertScaleAbs()作了怎样的运算?

OpenCV 矩阵的掩膜操作

OpenCV 矩阵的掩膜操作

saturate_cast

opencv4opencv视频教程 C++(opencv教程)3矩阵的掩膜操作(filter2D)

计算机图形学——————图像的掩膜处理