当前位置: 首页 > news >正文

【opencv-Python学习笔记(6):阈值处理】

目标:

1. 明白阈值处理的作用及应用场景

2. 这段内容比较简单

说明:阈值函数是指剔除图像内像素值高于一定值或者低于一定值的像素点


1. cv2.threshold()函数

函数:ret, dst = cv2.threshold(src, thresh, maxval, type)

参数说明:

  • src:输入图像(必须是单通道灰度图)。
  • thresh:设定的阈值。
  • maxval:当像素值超过阈值(或满足特定条件)时,赋予的最大值(通常为 255,即白色)。
  • type:阈值处理的类型(核心参数,决定比较规则)。

返回值:

  • ret:实际使用的阈值(通常与输入的thresh相同)。
  • dst:处理后的输出图像。

(1)二值化阈值处理(cv2.THRESH_BINARY)

说明:二值阈值话将原始图像处理仅为两个值得二值图像

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

例如:在8位图像中,最大值为255,。我们的设定阈值为127

  • 所有大于127的像素点都会处理为255
  • 其他值会被处理为0

实例:

import  cv2img1 = cv2.imread("1.JPG",flags=cv2.IMREAD_GRAYSCALE)
dst,img2 = cv2.threshold(img1,127,255,cv2.THRESH_BINARY)
cv2.namedWindow("now",cv2.WINDOW_NORMAL)
cv2.namedWindow("original",cv2.WINDOW_NORMAL)
print(img2)
cv2.imshow("original",img1)
cv2.imshow("now",img2)
cv2.waitKey()
cv2.destroyAllWindows()

结果:

若图像不是单通道,则结果如下图:

(2)反二值化阈值处理(cv2.THRESH_BINARY_INV)

说明:跟上述反过来

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

(3)截断阈值化处理(cv2.THRESH_TRUNC

说明:该方法会将大于阈值的像素点的值设定为阈值,小于或者等于该阈值的像素点保持不变

例如:阈值选取127

  • 对于像素值大于127的像素点,其像素值被设定为127
  • 对于像素值小于或者等于127的像素点,其像素值保持不变

实例:

import  cv2img1 = cv2.imread("1.JPG",cv2.IMREAD_GRAYSCALE)
dst,img2 = cv2.threshold(img1,127,255,cv2.THRESH_TRUNC)
cv2.namedWindow("now",cv2.WINDOW_NORMAL)
cv2.namedWindow("original",cv2.WINDOW_NORMAL)
print(img2)
cv2.imshow("original",img1)
cv2.imshow("now",img2)
cv2.waitKey()
cv2.destroyAllWindows()

结果:

(4)超阈值领处理(cv2.THRESH_TOZERO

说明:超阈值领处理会将大于阈值的像素点处理为0,小于或者等于该阈值的像素点保持不变。

例如:阈值选取127

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

实例:

import  cv2img1 = cv2.imread("1.JPG",cv2.IMREAD_GRAYSCALE)
dst,img2 = cv2.threshold(img1,127,255,cv2.THRESH_TOZERO_INV)
cv2.namedWindow("now",cv2.WINDOW_NORMAL)
cv2.namedWindow("original",cv2.WINDOW_NORMAL)
print(img2)
cv2.imshow("original",img1)
cv2.imshow("now",img2)
cv2.waitKey()
cv2.destroyAllWindows()

结果:

(5)低阈值零处理

说明:低阈值零处理会将图像中小于或者等于阈值的像素点的值处理为0,大于阈值的像素点的值保持不变。

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

实例:

import  cv2img1 = cv2.imread("1.JPG",cv2.IMREAD_GRAYSCALE)
dst,img2 = cv2.threshold(img1,127,255,cv2.THRESH_TOZERO)
cv2.namedWindow("now",cv2.WINDOW_NORMAL)
cv2.namedWindow("original",cv2.WINDOW_NORMAL)
print(img2)
cv2.imshow("original",img1)
cv2.imshow("now",img2)
cv2.waitKey()
cv2.destroyAllWindows()

结果:

(6)Otsu处理

说明:直接设定个阈值对像素很不友好,例如:你的最大像素为125,而自己设定的阈值为127,。

Otsu会遍历所有可能阈值,从而找到最佳阈值。

ret, th = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) 

与普通阈值分割区别:

  • 参数type增加了一个参数值“cv2.THRESH_OTSU”
  • 设定的阈值为0
  • 返回值ret是Otsu方法计算得到并使用最优阈值

实例:

import  cv2img1 = cv2.imread("1.JPG",cv2.IMREAD_GRAYSCALE)
dst,img2 = cv2.threshold(img1,0,255,cv2.THRESH_TOZERO+cv2.THRESH_OTSU)
cv2.namedWindow("now",cv2.WINDOW_NORMAL)
cv2.namedWindow("original",cv2.WINDOW_NORMAL)
print(img2)
print(dst)
cv2.imshow("original",img1)
cv2.imshow("now",img2)
cv2.waitKey()
cv2.destroyAllWindows()

结果:之前设定的阈值为127,目前自动设定为129

(7)自适应阈值处理

说明:使用变化的阈值完成图像的阈值处理,主要方式为计算每个像素点周围临近区域的加权平均值获得阈值,并用该阈值对像素点进行处理。

函数:dst = cv2.adaptiveThreshold(src, maxval, adaptiveMethod, thresholdType, blockSize, C)

参数说明:

  • src:输入图像(必须是单通道灰度图)。
  • maxval:满足阈值条件时赋予的最大值(通常为 255)。
  • adaptiveMethod:计算局部阈值的方法(2 种):
    • cv2.ADAPTIVE_THRESH_MEAN_C:局部阈值 = 局部区域的平均值 - C
    • cv2.ADAPTIVE_THRESH_GAUSSIAN_C:局部阈值 = 局部区域的高斯加权平均值 - C
  • thresholdType:阈值处理类型(只能是二进制阈值或反二进制阈值):
    • cv2.THRESH_BINARY
    • cv2.THRESH_BINARY_INV
  • blockSize:局部区域的大小(必须是奇数,如 3、5、7...,表示以当前像素为中心的blockSize×blockSize窗口)。
  • C:常数(从局部平均值或加权平均值中减去的数值,用于调整阈值的偏移量,可正可负)。
import  cv2img1 = cv2.imread("1.JPG",cv2.IMREAD_GRAYSCALE)
# dst,img2 = cv2.threshold(img1,0,255,cv2.THRESH_TOZERO+cv2.THRESH_OTSU)
img2=cv2.adaptiveThreshold(img1,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,3)
cv2.namedWindow("now",cv2.WINDOW_NORMAL)
cv2.namedWindow("original",cv2.WINDOW_NORMAL)
print(img2)
cv2.imshow("original",img1)
cv2.imshow("now",img2)
cv2.waitKey()
cv2.destroyAllWindows()

结果:

    注意事项:输入必须是单通道灰度图,彩色图需先转换(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY))。blockSize必须是奇数(确保窗口有中心像素)。

      http://www.lryc.cn/news/624452.html

      相关文章:

    • 如何平衡电竞酒店和高校宿舍对AI云电竞游戏盒子的不同需求?
    • 云计算- KubeVirt 实操指南:VM 创建 、存储挂载、快照、VMI全流程 | 容器到虚拟机(镜像转换/资源调度)
    • AI需要防火墙,云计算需要重新构想
    • 我们为什么需要时序数据库?
    • AI大模型实战:用自然语言处理技术高效处理日常琐事
    • 云计算核心技术之容器技术
    • 网站服务器使用免费SSL证书安全吗?
    • Orange的运维学习日记--45.Ansible进阶之文件部署
    • 公司无公网IP,如何将内网服务,给外面异地连接使用?远程办公可通过什么访问?
    • 力扣70:爬楼梯
    • 终端管理一体化
    • 【图像算法 - 17】慧眼识“果”:基于深度学习与OpenCV的苹果智能检测系统(附完整代码)
    • 哪里找最新AI工具官网?如何快速对比ChatGPT替代品?AI工具导航指南 - AIbase
    • 实现make/makefile
    • MyCAT完整实验报告
    • 项目实战——矿物识别系统(利用机器学习从化学元素数据中识别矿物,从数据到分类模型)
    • 把 AI 编程助手塞进「离线 U 盘」——零依赖的 LLM-Coder 随行编译器
    • 8.18 打卡 DAY 45 Tensorboard使用介绍
    • Nextcloud 私有云部署:cpolar 内网穿透服务实现安全远程文件访问
    • lamp架构部署wordpress
    • 直播美颜SDK架构揭秘:动态贴纸功能的实现原理与性能优化
    • 【前端进阶】UI渲染优化 - 骨架屏技术详解与多框架实现方案
    • 【自动化运维神器Ansible】Ansible Roles详解:层次化、结构化组织Playbook的最佳实践
    • CMIP6 气候模式核心特性解析
    • 项目失败的常见原因及应对措施分析
    • 《红色脉-络:一部PLMN在中国的演进史诗 (1G-6G)》 第6篇 | 专题:核心网的第一次革命——从电路交换到“用户/控制面分离”
    • kali linux从入门到精通教程
    • 20. 云计算-多租户
    • apisix负载均衡测试
    • 一些常见的聚类算法原理解析与实践