【OpenCV】—阈值化

news/2024/7/21 6:25:49 标签: opencv, 计算机视觉, 图像处理

什么是阈值化?

答:在对各种图形进行处理操作的过程中,需要对图像中的像素做出取舍与决策,直接剔除一些低于或者高于一定值的像素。阈值可以被视作最简单的图像分割方法。如:从一副图像中利用阈值分割出我们需要的物体部分。图像分割方法基于图像中物体与背景之间的灰度差异,其中分割属于像素级的分割。

用法:阈值的选取依赖于具体的问题。即物体在不同的图像中可能会有不同的灰度值。一旦找到需要分割的物体的像素点,可以对这些像素点设定一些特定的值来表示。


文章目录

      • 1、固定阈值操作:Threshold()函数
      • 2、自适应阈值操作:adaptiveThreshold()函数
      • 3、示例程序

1、固定阈值操作:Threshold()函数

说明:函数Threshold()对单通道数组应用固定阈值操作。该函数的典型应用是对灰度值图像进行阈值操作得到二值图像,(compare()函数也可以达到此目的)或者是去掉噪声,例如过滤很小或很大像素值的图像点。

double threshold(InputArray src,OutputArray dst,double thresh,double maxval,int type)
  • 第一个参数:输入数组,填单通道,8或者32位浮点类型的Mat

  • 第二个参数:函数调用后运算结果存在这里,即这个参数用于存放输出结果,且和第一个参数中的Mat变量有一样的尺寸和类型

  • 第三个参数:阈值的具体值

  • 第四个参数:当第五个参数阈值类型type取CV_THRESH或CV_THRESH_BINARY_INV时阈值类型的最大值

  • 第五个参数:阈值类型。

    下面左边标识符依次取值0,1,2,3,4——一一对应右边的图形化的阈值描述

在这里插入图片描述

2、自适应阈值操作:adaptiveThreshold()函数

说明:自适应阈值操作是对矩阵采用自适应阈值操作,支持就地操作

void adaptiveThreshold(InputArray src,OutputArray dst,double maxValue,int adaptiveMethod,int thresholdType,int blockSize,double C)
  • 第一个参数:输入图形,即源图像,填Mat类对象的即可,且需为8位单通道浮点型图形
  • 第二个参数:函数调用后的运算结果存在这里,需要和源图像有一样的尺寸和类型
  • 第三个参数:给像素赋的满足条件的非零值。
  • 第四个参数:用于指定要使用的自适应阈值算法,可取值为ADAPTIVE_THRESH_MEAN_C或者ADAPTIVE_THRESH_GAUSSIAN_C
  • 第五个参数:阈值类型。取值必须为THRESH_BINARY、THRESH_BINARY_INV其中之一
  • 第六个参数:用于计算阈值大小的一个像素的邻域尺寸,取值3、5、7等
  • 第七个参数:减去平均或加权平均值后的常数值。通常其为正数,但少数情况下也可以为0或者负数。

adaptiveThreshold()函数有如下将一幅灰度图变换为一幅二值图公式:

(1)当第五个参数“阈值类型”thresholdType取值为THRESH_BINARY时:

在这里插入图片描述

(2)当第五个参数取值为THRESH_BINARY_INV时:

在这里插入图片描述

(3)其中的T(x,y)为分别计算每个单独像素的阈值,取值如下:

  • 对于ADAPTIVE_THRESH_MEAN_C方法,阈值T(x,y)为blockSize X blockSize邻域内(x,y)减去第七个参数C的平均值。
  • 对于ADAPTIVE_THRESH_GAUSSIAN_C方法,阈值T(x,y)为blockSize X blockSize邻域内(x,y)减去第七个参数C与高斯窗交叉相关的加权总和。

3、示例程序

#include<opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace std;
using namespace cv;
#define WINDOW_NAME "【程序窗口】"

//--------------------------------
//	全局变量声明
//--------------------------------
int g_nThresholdValue = 100;
int g_nThresholdType = 3;
Mat g_srcImage, g_grayImage, g_dstImage;

//--------------------------------
//	全局函数声明
//--------------------------------
static void ShowHelpText();//输出帮助文字
void on_Threshold(int, void *);//回调函数

int main()
{
	system("color 5E");
	//读入源图片
	g_srcImage = imread("E:\\Pec\\黑寡妇.jpg");

	//存留一部分原图的灰度图
	cvtColor(g_srcImage, g_grayImage, COLOR_RGB2GRAY);

	//创建窗口并显示原始图
	namedWindow(WINDOW_NAME, WINDOW_AUTOSIZE);
	imshow("【原始图】", g_srcImage);
	//创建滑动条来控制阈值
	createTrackbar("模式", WINDOW_NAME, &g_nThresholdType, 4, on_Threshold);
	createTrackbar("参数值", WINDOW_NAME, &g_nThresholdValue, 255, on_Threshold);

	//初始化自定义的阈值回调函数
	on_Threshold(0, 0);

	//轮询等待用户按键,如果ESC按键按下则退出程序
	while (1)
	{
		int key;
		key = waitKey(20);
		if ((char)key == 27)
			break;
	}
}
void on_Threshold(int, void*)
{
	//调用阈值函数
	threshold(g_grayImage, g_dstImage, g_nThresholdValue, 255, g_nThresholdType);

	imshow(WINDOW_NAME, g_dstImage);
}

(1)原始图
在这里插入图片描述

(2)模式0:二进制阈值
在这里插入图片描述

(3)模式1:反二进制阈值
在这里插入图片描述

(4)模式2:截断阈值
在这里插入图片描述

(5)模式3:反阈值化为0
在这里插入图片描述

(6)模式4:阈值化为0
在这里插入图片描述


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

相关文章

两个字---经典,没话说!

婚前 女&#xff1a;你原先有过女朋友? 男&#xff1a;十年生死两茫茫&#xff0c;不思量&#xff0c;自难忘。 女&#xff1a;死了?怎么死的? 男&#xff1a;山天陵&#xff0c;江水为竭&#xff0c;冬雷阵阵夏雨雪。 女&#xff1a;喔&#xff0c;是天灾。那这些年你怎么过…

react设置多个className

在一个元素上设置样式&#xff0c;有一个固定的样式&#xff0c;然后还有一个使用三元运算符根据条件添加的样式。 比如说有一个固定样式"title": <div className"title">标题</div>&#xff0c; 然后还要一个点击高亮的样式: <div classNa…

pycharm配置opencv库

我走的弯路&#xff1a; 对于刚刚入手OpenCV 的小白&#xff0c;又第一次接触pycharm编译器。所以在配置opencv库的时候遇到很多问题。 如下&#xff1a; 1、如果直接在Terminal运行界面输入【pip install opencv-python】&#xff0c;因为这个访问的是国外的&#xff0c;所以…

交换2个变量的值

代码 //int a 5,b10;//1.//a a b;//b a - b; //a a - b;//2.//a b (b a)*0;//或者aab-(ba)//3.//a^ b^(b^a^b);//4.//a^b;//b^a;//a^b;//5.//a a^b;//b b^a;//a a^b;//js//6.//a [5,10];//a [a,b];//a a[1];//b a[0];//js//7.//a {b:a,a:b};//a a.a;//b a.b;…

【python版CV】—图像基本操作

1、数据读取-图像 cv2.IMREAD_COLOR&#xff1a;彩色图像cv2.IMREAD_GRAYSCALE&#xff1a;灰度图像 #输出图像函数 def cv_show(name,img):cv.imshow(name, img)#等待时间&#xff0c;毫秒级别。0表示任意键终止&#xff0c;1000表示1000毫秒关闭cv.waitKey(0)cv.destroyAll…

在sharepoint列表中增加审批功能后的问题(不断更新中)

在增加审批后可以通过新增加的两种视图方式查看列表,但如果通过自定义WebPart只能显示列表功能中被允许(审批通过)的File.如何能自定义显示的类型? 可以通过以下代码获得 1SPSite siteCollection SPControl.GetContextSite(Context);2SPWebCollection subSites siteCollection…

vue的首页渲染了两次的原因以及解决方法

现在在用vue做一些单页面应用的东西&#xff0c;遇到了些许问题啊&#xff0c;比如我再渲染首页的时候&#xff0c;会渲染两次&#xff0c;查看了一下原因&#xff0c;原来是在写路由的时候写的格式错了&#xff1a; 这样的时候&#xff0c;初始的时候就是加载的exam_list页面&…

【python版CV】-图像处理(1)

开头一下&#xff1a; 上一篇学习完了图像的基础操作&#xff0c;这一篇博客是记录图像处理的一部分。回顾python版的OpenCV第二篇&#xff0c;对于相关的图像处理也有一定的了解。视频参考B站唐宇迪博士&#xff0c;也是来自一位计算机视觉的大佬推荐。 文章目录1、图像阈值2、…