09. 图像的阈值处理

一、什么是阈值处理

  阈值处理是指剔除图像内的像素值高于一定值或者低于一定值的像素点。按照上述阈值处理方式,可以将一幅灰度图像处理为一幅二至图像,很好地将前景和背景区分开。

  我们可以在终端中使用 pip 安装 OpenCV 模块。默认是从国外的主站上下载,因此,我们可能会遇到网络不好的情况导致下载失败。我们可以在 pip 指令后通过 -i 指定国内镜像源下载

pip install opencv-python -i https://mirrors.aliyun.com/pypi/simple

  国内常用的 pip 下载源列表:

  • 阿里云 https://mirrors.aliyun.com/pypi/simple
  • 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple
  • 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple
  • 中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple

  在 OpenCV 中,提供了 cv2.threshold() 函数用于实现阈值处理。

cv2.threshold(src: cv2.typing.MatLike, thresh: float, maxval: float, type: int, dst: cv2.typing.MatLike | None = ...) -> tuple[float, cv2.typing.MatLike]: ...

  其中,参数 src原始图像,推荐使用 灰度图。参数 thresh要设置的阈值。参数 maxval 表示当 type 参数为 cv2.THRESH_BINARY 或者 cv2.THRESH_BINARY_INV 类型时,需要设定的最大值。参数 type阈值分割的类型。参数 dst边缘检测后的图像

  参数 type阈值分割的类型,它的取值如下:

cv2.THRESH_BINARY                                                               # 二值化阈值处理
cv2.THRESH_BINARY_INV                                                           # 反二值化阈值处理
cv2.THRESH_TRUNC                                                                # 截断阈值处理
cv2.THRESH_TOZERO                                                               # 低阈值零处理
cv2.THRESH_TOZERO_INV                                                           # 超阈值零处理
cv2.THRESH_MASK                                                                 # 掩码阈值处理
cv2.THRESH_OTSU                                                                 # Otsu阈值处理
cv2.THRESH_TRIANGLE                                                             # 三角形阈值处理

【1】、二值化阈值处理

  二值阈值处理会将原始图像处理为仅有两个值的二值图像,其针对像素点的处理方式如下:

  • 对于灰度值大于阈值 thresh 的像素点,将其灰度值设定为最大值。
  • 对于灰度值小于或等于阈值 thresh 的像素点,将其灰度值设置为 0。

二值化阈值处理

import cv2
import numpy as npif __name__ == '__main__':src = np.random.randint(0, 256, (5, 5), dtype=np.uint8)# 二值化阈值处理threshold_value, dst = cv2.threshold(src, 128, 255, cv2.THRESH_BINARY)print("src: \n", src)print("threshold value: ", threshold_value)print("dst: \n", dst)

【2】、反二值化阈值处理

  反二值阈值处理的结果也是仅有两个值的二值图像,与二值化阈值处理的区别在于,两者对像素值的处理方式不同。反二值化阈值处理针对像素点的处理方式为:

  • 对于灰度值大于阈值的像素点,将其值设置为 0。
  • 对于灰度值小于或等于阈值的像素点,将其值设置为 255。

反二值化阈值处理

import cv2
import numpy as npif __name__ == '__main__':src = np.random.randint(0, 256, (5, 5), dtype=np.uint8)# 反二值化阈值处理threshold_value, dst = cv2.threshold(src, 128, 255, cv2.THRESH_BINARY_INV)print("src: \n", src)print("threshold value: ", threshold_value)print("dst: \n", dst)

【3】、截断阈值处理

  截断阈值化处理会将图像中大于阈值的像素值的值设置为阈值,小于或等于该阈值的像素点的值保持不变。

截断阈值化处理

import cv2
import numpy as npif __name__ == '__main__':src = np.random.randint(0, 256, (5, 5), dtype=np.uint8)# 截断阈值处理threshold_value, dst = cv2.threshold(src, 128, 255, cv2.THRESH_TRUNC)print("src: \n", src)print("threshold value: ", threshold_value)print("dst: \n", dst)

【4】、低阈值零处理

  低阈值零处理会将图像中小于或等于阈值的像素点的值处理为 0,大于阈值的像素点的值保持不变,即先选定一个阈值,然后对图像做如下处理:

  • 对于像素值大于阈值的像素点,其值将保持不变。
  • 对于像素值小于或等于阈值的像素点,其值将被处理为 0。

低阈值零处理

import cv2
import numpy as npif __name__ == '__main__':src = np.random.randint(0, 256, (5, 5), dtype=np.uint8)# 低阈值零处理threshold_value, dst = cv2.threshold(src, 128, 255, cv2.THRESH_TOZERO)print("src: \n", src)print("threshold value: ", threshold_value)print("dst: \n", dst)

【5】、超阈值零处理

  超阈值零处理会将图像中大于阈值的像素点的值处理为 0,小于或等于该阈值的像素点的值保持不变,即先选定一个阈值,然后对图像做如下处理:

  • 对于像素值大于阈值的像素点,其像素点将被处理为 0。
  • 对于像素点小于或等于阈值的像素点,其像素点将保持不变。

超阈值零处理

import cv2
import numpy as npif __name__ == '__main__':src = np.random.randint(0, 256, (5, 5), dtype=np.uint8)# 超阈值零处理threshold_value, dst = cv2.threshold(src, 128, 255, cv2.THRESH_TOZERO_INV)print("src: \n", src)print("threshold value: ", threshold_value)print("dst: \n", dst)

【6】、Otsu 阈值处理

  在使用 cv2.threshold() 函数进行阈值处理时,需要自定义一个阈值,并以此阈值作为图像阈值处理的依据。通常情况下处理的图像都是色彩均衡的,这时直接将阈值设为 127 是比较合适的。但是,有些图像灰度值的分布是不均衡的,如果此时还将阈值设置为 127,那么阈值的结果就是失败的。

  Otsu 方法能够根据当前图像给出最佳的类间分割阈值。简而言之,Otsu 方法会遍历所有可能阈值,从而找到最佳的阈值。Otst 方法,也被称为最大类间方差法。该方法使用的是聚类的思想,它把图像中所有像素点的像素值按灰度分成两组,确保:

  • 两组之间,灰度值差异最大。
  • 两组之内,灰度值差异最小。

  Otsu 方法通过方差的计算,来寻找最佳的灰度级作为分组依据。它的计算简单方便,同时它不容易受到图像亮度和对比度的影响。因此,Otsu 算法是对复杂图像进行阈值分割时,计算阈值的一种非常有效的方法。

  在 OpenCV 中,通过在 cv2.shreshold() 函数中对 type 参数多传入一个 cv2.THRESH_OTSU 值,即可以实现 Otsu 方式的阈值分割。在使用 Otsu 方法时,需要把阈值设置为 0。此时,cv2.threshold() 函数会自动寻找最有阈值,并将该阈值返回。

import cv2
import numpy as npif __name__ == '__main__':src = np.random.randint(0, 256, (5, 5), dtype=np.uint8)# Otsu阈值处理threshold_value, dst = cv2.threshold(src, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)print("src: \n", src)print("threshold value: ", threshold_value)print("dst: \n", dst)

二、自适应阈值处理

  对于色彩均衡的图像,直接使用一个阈值就能够完成对图像的阈值化处理。但是,有时图像的色彩是不均衡的,此时如果只使用一个阈值,就无法得到清晰有效的阈值分割结果图像。有一种改进的阈值处理技术,其使用变化的阈值完成对图像的阈值处理,这种技术被称为自适应阈值处理。

  在进行阈值处理时,自适应阈值处理的方式通过计算每个图像点周围邻近区域的加权平均值获得阈值,并使用该阈值对当前像素点进行处理。与普通的阈值处理方法相比,自适应阈值能力能够更好地处理明暗差异过大的图像。

  在 OpenCV 中,提供了 cv2.adaptiveThreshold() 函数用于实现自适应阈值处理。

cv2.adaptiveThreshold(src: cv2.typing.MatLike, maxValue: float, adaptiveMethod: int, thresholdType: int, blockSize: int, C: float, dst: cv2.typing.MatLike | None = ...) -> cv2.typing.MatLike: ...

  其中,参数 src原始图像,该图像必须是 8 位单通道的图像。参数 maxValue最大值。参数 adaptiveMethod自适应方法。参数 thresholdType阈值处理方式,该值必须是 cv2.THRESH_BINARY 或者 cv2.THRESH_BINARY_INV 中的一个。参数 blockSize块大小,表示一个像素在计算其阈值时所使用的邻域尺寸。参数 c常量。参数 dst边缘检测后的图像

   cv2.adaptiveThreshold() 函数根据参数 adaptiveMethod 来确定自适应阈值的计算方法。它包含cv2.ADAPTIVE_THRESH_MEAN_Ccv2.ADAPTIVE_THRESH_GAUSSIAN_C 两种不同的方法。这两种方法都是逐个像素的计算自适应阈值的,自适应阈值等于每个像素由 blockSize 参数所指定邻域的加权平均值减去常量 c。两种不同的方法在计算邻域的加权平均值是所采用的方式不同:

cv2.ADAPTIVE_THRESH_MEAN_C                                                      # 邻域所有像素点的权重值是一致的
cv2.ADAPTIVE_THRESH_GAUSSIAN_C                                                  # 邻域所有像素点的权重值是根据高斯分布计算的
import sys
import cv2if __name__ == '__main__':src = cv2.imread("assets/images/sudoku.png")if src is None:print("加载图片失败")sys.exit(0)gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)                                # 转换为灰度图像# 自适应阈值dst = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 7, 0)cv2.imshow("dst", dst)cv2.waitKey(0)cv2.destroyAllWindows()sys.exit(0)

自适应阈值处理

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

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

相关文章

福育未来人口监测与预测系统 个人项目汇报 102302138林楚涵

福育未来人口监测与预测系统 作者:林楚涵 所属团队:来财小组 角色:后端开发负责人 完成时间:2025年12月 一、项目概况 项目名称:福育未来 小组名称:来财 项目背景:全球正经历深刻的人口结构转型,核心特征为生育…

论文AI率从高到低,这五佳工具更快

又到毕业季,毕业论文除了查重外,真的别忘记查ai率。 今天就告诉大家高重复率以及高ai率应该如何快速降低!实测全网产品,无广!! 如果这篇整理能帮你少走点弯路,那就值了。 1、嘎嘎降AI 官网&…

理解机器学习里的NFL定理

NFL定理Qwen3-max摘要:如果问题不确定,任何算法都没有优劣之分。换而言之,算法的优越性不是绝对的,而是相对于特定问题类而言的。没有“通用最优”算法,必须(对应现实问题)引入“归纳偏置”&…

五佳降AI工具分享,论文党必收藏

又到毕业季,毕业论文除了查重外,真的别忘记查ai率。 今天就告诉大家高重复率以及高ai率应该如何快速降低!实测全网产品,无广!! 如果这篇整理能帮你少走点弯路,那就值了。 1、嘎嘎降AI 官网&…

Zed编辑器安装与使用Agent Servers(腾讯CodeBuddy、阿里百炼Qwen Code、DeepSeek Cli)

Zed编辑器安装与使用Agent Servers 在win11操作系统 腾讯CodeBuddy # 选择你喜欢的包管理器执行以下命令 npm install -g tencent-ai/codebuddy-code# 安装完成后,运行以下命令验证是否安装成功 codebuddy --version#2.26.0阿里百炼Qwen Code # 选择你喜欢的包管理器…

进程,动态库,COM机制关系概述

在一个应用程序运行实例中,主程序,以及所调用的模块,库都是在同一个进程中吗?它们的核心工作机制和原理是什么? 在一个应用程序的运行实例中,主程序、它调用的所有模块(如DLL、SO)和…

RAG学习笔记 检索优化

检索增强技术进阶学习笔记 混合检索 (Hybrid Search) 核心思想:结合稀疏向量与密集向量,利用关键词精确匹配与语义理解的双重优势,克服单一检索的局限性。 技术原理:稀疏向量 (Sparse Vectors):表示:基于词频统计…

【毕业设计】基于SpringBoot的汽车配件仓储管理系统设计与实现(源码+文档+远程调试,全bao定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

降AI率不靠硬改,前五工具更省事

又到毕业季,毕业论文除了查重外,真的别忘记查ai率。 今天就告诉大家高重复率以及高ai率应该如何快速降低!实测全网产品,无广!! 如果这篇整理能帮你少走点弯路,那就值了。 1、嘎嘎降AI 官网&…

Kingbase-KEMCC配置集群监控纳管ES以及外部备份使用对象存储

之前有幸测试过的KEMCC, 有了新版本,有幸拿到内测版本,进行提前体验测试。 这里就不过多的介绍KEMCC和安装方式了,可以看这篇文章: Kingbase-金仓企业级统一管控平台KEMCC安装初体验 关于KEMCC非云初始化以及实例管…

Java计算机毕设之基于SpringBoot的汽车配件仓储管理系统设计与实现配件信息、供应商、库存、采购、销售(完整前后端代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

读书笔记7-12.4

第七章主要讲的是项目启动前必须搞定的那些“大问题”,就像盖房子前得先打好地基一样。作者认为,如果这些问题没想清楚,项目从一开始就注定要失败。这一章的核心思想是,在动手写代码之前,得先搞清楚用户到底要什么…

【基于LLaMA-Factory通义千问】大模型微调全流程技术解析

文章目录 目录一、前置认知:核心基础信息与硬件适配1.1 核心基础属性1.2 核心技术-硬件-数据关联 二、核心环节一:4万条领域数据预处理与格式转换2.1 数据预处理2.2 格式转换 三、核心环节二:LoRA参数调优(32B模型)与2…

Java毕设选题推荐:基于SpringBoot+Vue的汽车配件仓储管理系统管理系统设计基于SpringBoot的汽车配件仓储管理系统设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

UDP-N-叠氮乙酰葡萄糖胺二钠盐:糖蛋白化学生物学研究的关键工具

UDP-N-2-[(叠氮基乙酰基)氨基]-2-脱氧-D-葡萄糖二钠盐(UDP-N-azidoacetylglucosamine disodium salt)是一类经过化学生物学改造的糖核苷酸。作为代谢糖工程的核心试剂,它使得研究人员能够对细胞内的糖基化过程进行特异性标记与调控&#xff0…

从Java全栈开发到云原生实践:一次真实面试的深度记录

从Java全栈开发到云原生实践:一次真实面试的深度记录 面试官与应聘者的初次接触 面试官:你好,我是负责技术面试的工程师,今天主要想了解一下你的技术背景和项目经验。可以先简单介绍一下你自己吗? 应聘者:好…

AI原生语义搜索:从理论到实践的全面解析

AI原生语义搜索:从理论到实践的全面解析 关键词:AI原生语义搜索、自然语言处理(NLP)、向量检索(Vector Search)、预训练模型、语义理解、Embedding、多模态搜索 摘要:本文从“用户想找‘苹果’却…

P5607 [Ynoi2013] 无力回天 NOI2017 题解

一道很好的题,如果做法不当(像我)可能需要一些卡常。 Part 1. bitset 20tps 插入?并集? \(1e5\) ?显然可以用 \(bitset\) 维护:每次修改把第 \(x\) 个 \(bitset\) 中的第 \(y\) 位修改成1 每次查询将 \(x1\) 和…

【计算机毕业设计案例】基于SpringBoot的学校图书管理系统设计与实现图书管理、借阅记录、审核借阅、图书续借、审核续借、确认归还(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…