python学opencv|读取图像(三十九 )阈值处理Otsu方法

【1】引言

前序学习了5种阈值处理方法,包括(反)阈值处理、(反)零值处理和截断处理,还学习了一种自适应处理方法,相关文章链接为:

python学opencv|读取图像(三十三)阈值处理-灰度图像-CSDN博客

python学opencv|读取图像(三十四)阈值处理-彩色图像-CSDN博客

python学opencv|读取图像(三十五)反阈值处理-CSDN博客

python学opencv|读取图像(三十六)(反)零值处理-CSDN博客

python学opencv|读取图像(三十七 )截断处理-CSDN博客

python学opencv|读取图像(三十八 )阈值自适应处理-CSDN博客

在上述所有文章中,阈值开关都是自己随机设置的,因此,实际效果可能未必是最佳。

如果有一种方法,可以让函数自动选取最佳阈值开关,那就能时刻获得最佳的阈值处理效果,这个方法就是:“阈值处理参数+Otsu”。

【2】官网教程

Otsu方法的说明,点击下方链接可以直达:

OpenCV: Miscellaneous Image Transformations

官网页面关于Otsu方法的说明为:

图1

实际上,使用Otsu方法时,必须配合前述5种阈值处理方法一起进行阈值调整。因为Otsu方法本身是来辅助选择最优的阈值开关,所以阈值处理方法还需要保留。

在下述官网示例说明中,我们会看到这一解释:

import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块# 读取图片-直接转化灰度图
src = cv.imread('srcf.png',0) #读取图像
dst=src#输出图像# 读取图片-函数转化灰度图
src1 = cv.imread('srcf.png') #读取图像
dst1=cv.cvtColor(src1,cv.COLOR_BGR2GRAY) #转化为灰度图dstt=np.hstack((dst,dst1)) #两种灰度图拼接在一起

OpenCV: Image Thresholding

图2

【3】代码测试

首先引入必要的模块和原图像:

import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块# 读取图片-直接转化灰度图
src = cv.imread('srcf.png',0) #读取图像
dst=src#输出图像# 读取图片-函数转化灰度图
src1 = cv.imread('srcf.png') #读取图像
dst1=cv.cvtColor(src1,cv.COLOR_BGR2GRAY) #转化为灰度图dstt=np.hstack((dst,dst1)) #两种灰度图拼接在一起

然后进行Otsu处理,为进行对比,也做了零值处理:

#阈值处理
t2,dst2=cv.threshold(src,58,158,cv.THRESH_TOZERO) #零值-阈值开关58,阈值上限158
t3,dst3=cv.threshold(src,0,255,cv.THRESH_TOZERO+cv.THRESH_OTSU) #零值+OTSU
dsto=np.hstack((dst2,dst3)) #两种阈值处理图拼接在一起

之后显示图像和保存图像:

# 在屏幕展示效果
cv.imshow('srcdstt', dstt)  # 在屏幕展示效果
cv.imshow('srcdsto', dsto)  # 在屏幕展示效果#显示BGR值
print("dst1像素数为[100,100]位置处的BGR=", dst1[100, 100])  # 获取像素数为[100,100]位置处的BGR
print("dst2像素数为[100,100]位置处的BGR=", dst2[100, 100])  # 获取像素数为[100,100]位置处的BGR
print("dst3像素数为[100,100]位置处的BGR=", dst3[100, 100])  # 获取像素数为[100,100]位置处的BGR#保存图像
cv.imwrite('srcf-dstt.png', dstt)  # 保存图像
cv.imwrite('srcf-dst2.png', dst3)  # 保存图像
cv.imwrite('srcf-dsto.png', dsto)  # 保存图像cv.waitKey()  # 图像不会自动关闭
cv.destroyAllWindows()  # 释放所有窗口

此处使用的原始图像为:

图3

转化后的灰度图为:

图4 灰度图

进行单纯零值处理和零值处理+OTSU处理后的图像为:

图5 单纯零值处理和零值处理+OTSU处理

由图5可见,右侧为零值处理+OTSU处理后的图像,更趋向于突出轮廓边线。

由于OTSU处理图像会自动选择最佳阈值开关,所以我们输出了特定位置的BGR值:

图6 特定像素点BGR值

dst1为转后的原始灰度图,dst2为单纯零值处理图,dst3为零值处理+OTSU处理后的图像。

由图6可见,零值处理+OTSU处理后的图像,自动选择的阈值开关也没有超过156,所以这两个图在像素点[100][100]处的BGR值完全相等。

【4】细节说明

使用Otsu方法的时候,依然调用cv2.threshold()函数,虽然此时Otsu会自动选择阈值开关,但仍然需要在阈值开关的位置写"0"。

图7 提前设定阈值开关为0

【5】总结

掌握了python+opencv实现Otsu自动调整阈值开关的操作技巧。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/4848.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(一)相机标定——四大坐标系的介绍、对应转换、畸变原理以及OpenCV完整代码实战(C++版)

一、四大坐标系介绍 1,世界坐标系 从这个世界(world)的视角来看物体 世界坐标系是3D空间坐标,每个点的位置用 ( X w , Y w , Z w ) (X_w,Y_w,Z_w) (Xw​,Yw​,Zw​)表示 2,相机坐标系 相机本身具有一个坐标系&…

从CRUD到高级功能:EF Core在.NET Core中全面应用(三)

目录 IQueryable使用 原生SQL使用 实体状态跟踪 全局查询筛选器 并发控制使用 IQueryable使用 在EFCore中IQueryable是一个接口用于表示可查询的集合,它继承自IEnumerable但具有一些关键的区别,使得它在处理数据库查询时非常有用,普通集…

STM32之CubeMX图形化工具开发介绍(十七)

STM32F407 系列文章 - STM32CubeMX(十七) 目录 前言 一、CubeMX 二、下载安装 1.下载 2.安装 3.图解步骤 三、用户界面 1.项目配置 2.项目生成 3.项目文件解释 4.新建工程 5.查看原工程 四、FAQ 总结 前言 STMCube源自意法半导体&#xf…

idea中远程调试中配置的参数说明

Ⅰ 远程调试中配置的端口号与服务本身端口号区别 一、远程调试中配置端口号的作用 在 IDEA 中进行远程调试时配置的端口号主要用于建立开发工具(如 IDEA)和远程服务之间的调试连接。当你启动远程调试时,IDEA 会监听这个配置的端口号&#xf…

gitlab使用多数据库

1. 说明 默认情况下,GitLab 使用一个单一的应用数据库,称为主数据库。为了扩展 GitLab,您可以将 GitLab 配置为使用多个应用数据库。 设置多个数据库后,GitLab 将使用第二个应用数据库用于 CI/CD 功能,称为 CI 数据库…

【博客之星2024】技术创作与成长的全景回顾与突破 —— “千里之行,始于足下“

《热爱生命》 汪国真 我不去想是否能够成功 既然选择了远方 便只顾风雨兼程 我不去想能否赢得爱情 既然钟情于玫瑰 就勇敢地吐露真诚 我不去想身后会不会袭来寒风冷雨 既然目标是地平线 留给世界的只能是背影 我不去想未来是平坦还是泥泞 只要热爱生命 一切,都在意料…

leetcode刷题记录(七十二)——146. LRU 缓存

(一)问题描述 146. LRU 缓存 - 力扣(LeetCode)146. LRU 缓存 - 请你设计并实现一个满足 LRU (最近最少使用) 缓存 [https://baike.baidu.com/item/LRU] 约束的数据结构。实现 LRUCache 类: * LRUCache(int capacity)…

两份PDF文档,如何比对差异,快速定位不同之处?

PDF文档比对是通过专门的工具或软件,自动检测两个PDF文件之间的差异,并以可视化的方式展示出来。这些差异可能包括文本内容的修改、图像的变化、表格数据的调整、格式的改变等。比对工具通常会标记出新增、删除或修改的部分,帮助用户快速定位…

TongESB7.1.0.0如何使用dockercompose运行镜像(by lqw)

文章目录 安装准备安装 安装准备 1.安装好docker和dockercompose: docker、docker-compose安装教程,很详细 2.上传好安装相关文件 安装 使用以下命令导入管理端镜像和运行时镜像 docker load -i tongesb_manage_7100.tar docker load -i tongesb_se…

Java基于SSM框架的社区团购系统小程序设计与实现(附源码,文档,部署)

Java基于SSM框架的社区团购系统小程序设计与实现 博主介绍:✌程序猿徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 &#x1f4…

【Linux】gawk编辑器二

一、变量 gawk编程语言支持两种变量:内建变量和自定义变量。 1、内建变量 gawk使用内建变量来引用一些特殊的功能。 字段和记录分隔符变量 数据字段变量 此变量允许使用美元符号($)和字段在记录中的位置值来引用对应的字段。要引用记录…

【Linux】Linux入门(三)权限

目录 前提权限概念whoami指令 Linux权限管理文件访问者的分类(人)file指令权限信息权限的表示方法 chmod指令 更改权限chown指令 修改文件,文件夹所属用户和用户组 权限掩码umask(权限掩码) 粘滞位 前提 请先看下面这…

Low-Level 大一统:如何使用Diffusion Models完成视频超分、去雨、去雾、降噪等所有Low-Level 任务?

Diffusion Models专栏文章汇总:入门与实战 前言:视频在传输过程中常常因为各种因素(如恶劣天气、噪声、压缩和传感器分辨率限制)而出现质量下降,这会严重影响计算机视觉任务(如目标检测和视频监控)的性能。现有的视频修复方法虽然取得了一些进展,但通常只能针对特定的退…

生产环境中常用的设计模式

生产环境中常用的设计模式 设计模式目的使用场景示例单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点- 日志记录器- 配置管理器工厂方法模式定义一个创建对象的接口,让子类决定实例化哪个类- 各种工厂类(如视频游戏工厂模式创…

点云目标检测训练数据预处理---平面拟合与坐标转换(python实现)

在做centerpoint训练之前,需要先对点云数据进行标注,然后制作kittti数据集。不用nuScenes或者waymo数据集的理由也很简单,因为麻烦,没有kitti数据集直观。 kitti数据集的格式如下,可以看到数据集中只有航向角&#xff…

一文大白话讲清楚webpack基本使用——2——css相关loader的配置和使用

一文大白话讲清楚webpack基本使用——2——css相关loader的配置和使用 1. 建议按文章顺序从头看是看 第一篇:一文大白话讲清楚啥是个webpack第二篇:一文大白话讲清楚webpack基本使用——1——完成webpack的初步构建然后看本篇,Loader的配置…

Python基于OpenCV和PyQt5的人脸识别上课签到系统【附源码】

博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…

2024年第十五届蓝桥杯青少组国赛(c++)真题—快速分解质因数

快速分解质因数 完整题目和在线测评可点击下方链接前往: 快速分解质因数_C_少儿编程题库学习中心-嗨信奥https://www.hixinao.com/tiku/cpp/show-3781.htmlhttps://www.hixinao.com/tiku/cpp/show-3781.html 若如其他赛事真题可自行前往题库中心查找,题…

使用Edge打开visio文件

使用Edge打开visio文件 打开Edge浏览器搜索‘vsdx edge’ 打开第一个搜索结果 Microsoft Support 根据上述打开的页面进行操作 第一步:安装Visio Viewer 第二步:添加注册表 桌面新增文本文件,将下面的内容放入新建文本中,修…

AT8870单通道直流电机驱动芯片

AT8870单通道直流电机驱动芯片 典型应用原理图 描述 AT8870是一款刷式直流电机驱动器,适用于打印机、电器、工业设备以及其他小型机器。两个逻辑输入控制H桥驱动器,该驱动器由四个N-MOS组成,能够以高达3.6A的峰值电流双向控制电机。利用电流…