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

2024-01-18 12:44

本文主要是介绍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/619032

相关文章

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

mapstruct中的@Mapper注解的基本用法

《mapstruct中的@Mapper注解的基本用法》在MapStruct中,@Mapper注解是核心注解之一,用于标记一个接口或抽象类为MapStruct的映射器(Mapper),本文给大家介绍ma... 目录1. 基本用法2. 常用属性3. 高级用法4. 注意事项5. 总结6. 编译异常处理在MapSt

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

MyBatis ResultMap 的基本用法示例详解

《MyBatisResultMap的基本用法示例详解》在MyBatis中,resultMap用于定义数据库查询结果到Java对象属性的映射关系,本文给大家介绍MyBatisResultMap的基本... 目录MyBATis 中的 resultMap1. resultMap 的基本语法2. 简单的 resul

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Java Multimap实现类与操作的具体示例

《JavaMultimap实现类与操作的具体示例》Multimap出现在Google的Guava库中,它为Java提供了更加灵活的集合操作,:本文主要介绍JavaMultimap实现类与操作的... 目录一、Multimap 概述Multimap 主要特点:二、Multimap 实现类1. ListMult

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接

git stash命令基本用法详解

《gitstash命令基本用法详解》gitstash是Git中一个非常有用的命令,它可以临时保存当前工作区的修改,让你可以切换到其他分支或者处理其他任务,而不需要提交这些还未完成的修改,这篇文章主要... 目录一、基本用法1. 保存当前修改(包括暂存区和工作区的内容)2. 查看保存了哪些 stash3. 恢

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷