10- OpenCV:基本阈值操作(Threshold)

2024-03-01 09:30

本文主要是介绍10- OpenCV:基本阈值操作(Threshold),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1、图像阈值

2、阈值类型

3、代码演示


1、图像阈值

(1)图像阈值(threshold)含义:是将图像中的像素值划分为不同类别的一种处理方法。通过设定一个特定的阈值,将像素值与阈值进行比较,根据比较结果将像素分为两个或多个类别。

        阈值 是什么?简单点说是把图像分割的标尺,这个标尺是根据什么产生的,阈值产生算法?阈值类型。(Binary segmentation)

(2)阈值的API

double threshold(

InputArray src, // 输入灰度图像

OutputArray dst, // 输出图像

double thresh, // 预设的阈值

double maxval, // 大于等于阈值的像素设置的最大值

int type // 阈值类型,将小于阈值的像素设置为0,大于等于阈值的像素设置为最大值。

);

需要注意的是,阈值的选择对于图像处理的效果非常重要,可以根据具体需求调整阈值的数值和阈值类型。另外,threshold函数还可以进行自适应阈值处理、Otsu阈值处理等更高级的图像分割方法。

2、阈值类型

(1)阈值二值化(threshold binary):

将图像分为两个类别,通常是将灰度图像转换为黑白图像。像素值小于等于阈值的被归为一类,大于阈值的被归为另一类。

左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值。

例子演示:(以二值化阈值为例)

假设有一幅灰度图像,像素值的范围是0到255。我们希望将图像中的目标物体分割出来,背景设置为黑色。

  1. 首先,选择一个合适的阈值,比如设定阈值为128。

  2. 对于每个像素,如果像素值<=128,则将其设置为黑色(0),否则设置为白色(255)。

  3. 重复上述步骤,对图像中的所有像素进行处理。

通过这个简单的二值化阈值处理,我们可以将图像中的目标物体与背景分离出来,得到一个二值图像,其中目标物体的像素值为白色,背景为黑色。

(2)阈值反二值化(threshold binary Inverted)

左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值。

(3)截断 (truncate)

左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值

(4)阈值取零 (threshold to zero)

左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值。

(5)阈值反取零(threshold to zero inverted)

左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值。

(6)THRESH_OTSU:标志来应用Otsu阈值处理。

Otsu方法是一种自动确定图像阈值的算法,它可以根据图像的灰度分布自适应地选择最佳阈值。

threshold(grayImage, dst, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);

Otsu会自动进行阈值设置,所以预设值为0即可,最大为255.

(7)THRESH_TRIANGLE:标志进行阈值处理。

它可以根据图像的灰度分布自适应地选择最佳阈值。THRESH_TRIANGLE方法通过寻找直方图的双峰之间的谷底来确定阈值。

需要注意的是,THRESH_TRIANGLE方法适用于具有双峰灰度分布的图像,对于其他类型的图像效果可能不理想。因此,在使用THRESH_TRIANGLE阈值处理之前,建议先观察图像的灰度直方图,确保图像具有双峰特性。

总结:阈值分割有5种方法,阈值寻找有2种方法。

另外可以了解:

(1)多级化阈值:将图像分为多个类别,每个类别代表一种特定的像素强度范围。通常用于图像分割和物体识别任务。

(2)自适应阈值:根据图像局部区域的统计特征来确定阈值,使得不同区域具有相对合适的阈值。适用于图像 不均匀光照或对比度变化较大的情况。

(3)基于直方图的阈值:利用图像的直方图信息来确定阈值,如Otsu's方法、基于最大类间方差、基于最小错误率等。

3、代码演示

(1)了解下createTrackbar,很实用一个接口。

createTrackbar是OpenCV中用于创建滑动条的函数。它可以在图像窗口中创建一个滑动条,通过滑动条来调整参数或阈值,实现实时交互。

int createTrackbar(

const String& trackbarname, // 滑动条的名称

const String& winname, // 滑动条所在的窗口名称

int* value, int count, // 初始值
TrackbarCallback onChange = 0, // 滑动条的最大值
void* userdata = 0 // 滑动条的回调函数

);

(2)例子展示

#include<opencv2\opencv.hpp>
#include<iostream>
#include <math.h>using namespace cv;// 图像阈值
Mat src, gray_src, dst;
int threshold_value = 127;
int threshold_max = 255;
int type_value = 2;
int type_max = 4;
const char* input_title = "input image";
const char* output_title = "binary image";
void Threshold_Demo(int, void*);
int main(int argc, char** argv)
{src = imread("test.jpg");if (!src.data){printf("could not load image...");return -1;}namedWindow(input_title, CV_WINDOW_AUTOSIZE);namedWindow(output_title, CV_WINDOW_AUTOSIZE);imshow(input_title, src);createTrackbar("Threshold Value:", output_title, &threshold_value, threshold_max, Threshold_Demo);createTrackbar("Type Value:", output_title, &type_value, type_max, Threshold_Demo);Threshold_Demo(0, 0);waitKey(0);return 0;
}void Threshold_Demo(int, void*)
{cvtColor(src, gray_src, CV_BGR2GRAY);// 单纯阈值的二值化// threshold(gray_src, dst, threshold_value, threshold_max, THRESH_BINARY);//THRESH_OTSU去找阈值的话,就会忽略预设的阈值,所以为0即可,最大值是255threshold(gray_src, dst, 0, 255, THRESH_OTSU | type_value);imshow(output_title, dst);
}

效果展示:

这篇关于10- OpenCV:基本阈值操作(Threshold)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/761982

相关文章

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Redis中管道操作pipeline的实现

《Redis中管道操作pipeline的实现》RedisPipeline是一种优化客户端与服务器通信的技术,通过批量发送和接收命令减少网络往返次数,提高命令执行效率,本文就来介绍一下Redis中管道操... 目录什么是pipeline场景一:我要向Redis新增大批量的数据分批处理事务( MULTI/EXE