opencv 图像阈值 二值化处理

news/2024/7/21 5:10:42 标签: opencv, c++, 图像处理

opencv___0">opencv 图像阈值 二值化处理

文章目录

  • opencv 图像阈值 二值化处理
    • 图像阈值
    • threshold 函数
    • 阈值类型
    • 图解
    • DEMO
    • 效果

图像阈值

设定一个阈值,将图片数据大于这个阈值和小于这个阈值的部分区分开来,常用的二值化处理就是将大于阈值的设置为255,小于阈值的设置为0。二值化处理目前只支持8位单通道图像。
也可以用于消除噪声(即滤除过小或过大的像素)。

threshold 函数

CV_EXPORTS_W double threshold( InputArray src, OutputArray dst,
                               double thresh, double maxval, int type );

@param src			//输入数组(多通道,8位或32位浮点数)。
@param dst 			//具有与src相同大小和类型以及相同通道数的输出数组。
@param thresh 		//阈值。
@param maxval 		//与#THRESH_BINARY和#THRESH_BINARY_INV阈值类型一起使用的最大值。
@param type			//阈值类型(请参阅#ThresholdTypes)。
@return				//如果使用了Otsu或Triangle方法,则计算出的阈值。

阈值类型

enum ThresholdTypes {
    THRESH_BINARY     = 0, //!< \f[\texttt{dst} (x,y) =  \fork{\texttt{maxval}}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{0}{otherwise}\f]
    THRESH_BINARY_INV = 1, //!< \f[\texttt{dst} (x,y) =  \fork{0}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{\texttt{maxval}}{otherwise}\f]
    THRESH_TRUNC      = 2, //!< \f[\texttt{dst} (x,y) =  \fork{\texttt{threshold}}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{\texttt{src}(x,y)}{otherwise}\f]
    THRESH_TOZERO     = 3, //!< \f[\texttt{dst} (x,y) =  \fork{\texttt{src}(x,y)}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{0}{otherwise}\f]
    THRESH_TOZERO_INV = 4, //!< \f[\texttt{dst} (x,y) =  \fork{0}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{\texttt{src}(x,y)}{otherwise}\f]
    THRESH_MASK       = 7,
    THRESH_OTSU       = 8, //!< flag, use Otsu algorithm to choose the optimal threshold value
    THRESH_TRIANGLE   = 16 //!< flag, use Triangle algorithm to choose the optimal threshold value
};

图解

蓝色为原始数据值,红色为阈值
在这里插入图片描述

  1. THRESH_BINARY 大于阈值的部分被置为255,小于部分被置为0
    在这里插入图片描述
  2. THRESH_BINARY_INV 大于阈值部分被置为0,小于部分被置为255
    在这里插入图片描述
  3. THRESH_TRUNC 大于阈值部分被置为threshold,小于部分保持原样
    在这里插入图片描述
  4. THRESH_TOZERO 小于阈值部分被置为0,大于部分保持不变
    在这里插入图片描述
  5. THRESH_TOZERO_INV 大于阈值部分被置为0,小于部分保持不变
    在这里插入图片描述

DEMO

int main() {
	cv::namedWindow("src",0);
	cv::namedWindow("dst", 0);
	cv::Mat src(255, 500, CV_8UC1, cv::Scalar(0));
	for (int i = 0; i < src.rows; ++i) {
		for (int j = 0; j < src.cols; ++j)
		{
			src.at<unsigned char>(i, j) = i;
		}
	}
	cv::imshow("src", src);
	cv::imwrite("./src.jpg", src);
	cv::Mat dst;
	double r = cv::threshold(src, dst, 128, 255, cv::THRESH_BINARY);
	cv::imshow("dst", dst);
	cv::imwrite("./dst_THRESH_BINARY.jpg", dst);
	cv::waitKey(0);
	r = cv::threshold(src, dst, 128, 255, cv::THRESH_BINARY_INV);
	cv::imshow("dst", dst);
	cv::imwrite("./dst_THRESH_BINARY_INV.jpg", dst);
	cv::waitKey(0);
	r = cv::threshold(src, dst, 128, 255, cv::THRESH_TRUNC);
	cv::imshow("dst", dst);
	cv::imwrite("./dst_THRESH_TRUNC.jpg", dst);
	cv::waitKey(0);
	r = cv::threshold(src, dst, 128, 255, cv::THRESH_TOZERO);
	cv::imshow("dst", dst);
	cv::imwrite("./dst_THRESH_TOZERO.jpg", dst);
	cv::waitKey(0);
	r = cv::threshold(src, dst, 128, 255, cv::THRESH_TOZERO_INV);
	cv::imshow("dst", dst);
	cv::imwrite("./dst_THRESH_TOZERO_INV.jpg", dst);
	cv::waitKey(0);
	r = cv::threshold(src, dst, 128, 255, cv::THRESH_OTSU);
	cv::imshow("dst", dst);
	cv::imwrite("./dst_THRESH_OTSU.jpg", dst);
	cv::waitKey(0);
	r = cv::threshold(src, dst, 128, 255, cv::THRESH_TRIANGLE);
	cv::imshow("dst", dst);
	cv::imwrite("./dst_THRESH_TRIANGLE.jpg", dst);
	cv::waitKey(0);

}

效果

  1. src原图
    在这里插入图片描述

  2. THRESH_BINARY 大于阈值的部分被置为255,小于部分被置为0
    在这里插入图片描述

  3. THRESH_BINARY_INV 大于阈值部分被置为0,小于部分被置为255
    在这里插入图片描述

  4. THRESH_TRUNC 大于阈值部分被置为threshold,小于部分保持原样
    在这里插入图片描述

  5. THRESH_TOZERO 小于阈值部分被置为0,大于部分保持不变
    在这里插入图片描述

  6. THRESH_TOZERO_INV 大于阈值部分被置为0,小于部分保持不变
    在这里插入图片描述

  7. THRESH_OTSU 二值化的一个很优的算法Otsu大津算法
    在这里插入图片描述

  8. THRESH_TRIANGLE
    在这里插入图片描述


http://www.niftyadmin.cn/n/1645334.html

相关文章

opencv 侵蚀erode 膨胀dilate 开运算 闭运算等形态学转换操作

文章目录1. 侵蚀 (白色区域减小)demo效果2. 扩张demo效果3. 形态学变化&#xff08;组合&#xff09;3.1开运算 cv::MORPH_OPENdemo效果3.2 闭运算 cv::MORPH_CLOSEdemo效果3.3 形态学梯度 cv::MORPH_GRADIENTdemo效果3.4 顶帽 cv::MORPH_TOPHATdemo效果3.5 黑帽 cv::MORPH_BLA…

C++图形开发(7):能进行抛物线运动且触墙能反弹的小球

今天来实现一下触墙能反弹的小球、 我们之前所实现的都只是小球的上下&#xff0c;也就是y轴方向的运动&#xff08;详见&#xff1a;C图形开发&#xff08;6&#xff09;&#xff1a;落下后能弹起的小球&#xff09;&#xff0c;那么要使小球能够呈抛物线状运动&#xff0c;我…

常用的16个c/c++面试题

1. C中static有什么作用 &#xff08;1&#xff09;隐藏。 当我们同时编译多个文件时&#xff0c;所有未加static前缀的全局变量和函数都具有全局可见性&#xff0c;故使用static在不同的文件中定义同名函数和同名变量&#xff0c;而不必担心命名冲突。 &#xff08;2&#xff…

C++之多态性与虚函数

面向对象程序设计中的多态性是指向不同的对象发送同一个消息&#xff0c;不同对象对应同一消息产生不同行为。在程序中消息就是调用函数&#xff0c;不同的行为就是指不同的实现方法&#xff0c;即执行不同的函数体。也可以这样说就是实现了“一个接口&#xff0c;多种方法”。…

web服务器上某一中文名文件无法访问

只需要在此目录下 convmv -f GBK -t UTF-8 --notest *.xxx 执行这个命令即可转载于:https://www.cnblogs.com/liaocheng/p/4360336.html

opencv HSV色彩空间 追踪特定颜色

文章目录HSV颜色模型opencv 的 HSV颜色分量范围改变颜色空间 cvtColor()对象追踪 inRange()DEMOHSV颜色模型 HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。、这个模型中颜色的参数分别是&…

设计模式C++学习笔记之一(Strategy策略模式)

无意中&#xff0c;从网上下到一本电子书《24种设计模式介绍与6大设计原则》&#xff0c;很好奇这里有24种设计模式&#xff0c;印象中GOF写的《设计模式》&#xff08;Design Patterns&#xff09;&#xff0c;好像只有23种吧。运行起来一看&#xff0c;还真挺吸引咱的&#x…

opencv 边缘检测 Sobel算子 Scharr算子 Laplacian算子 (c++)

文章目录简述&#xff1a;Sobel Scharr LaplacianSobel算子Scharr算子Laplacian 算子1. Sobel()DEMO效果2.Scharr()DEMO效果3. Laplacian()DEMO效果缩放&#xff0c;绝对值&#xff0c;转换为无符号的8位类型 convertScaleAbsDepth combinations简述&#xff1a;Sobel Scharr L…