当前位置: 首页 > 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.dtcms.com/a/337880.html

      相关文章:

    • 深入理解 depot_tools:Chromium 源码开发全流程(fetch/gclient/git cl 使用详解与踩坑经验)
    • Effective C++ 条款49:了解new-handler的行为
    • JAVA经典面试题:数据库调优
    • 算法题——字符串
    • input 标签的宽度根据内容自动调整
    • 电梯的构造|保养|维修视频全集_电梯安全与故障救援(课程下载)
    • JSX本质是什么
    • AI行业应用深度报告:金融、医疗、教育、制造业落地案例
    • Docker之redis安装
    • linux中的hostpath卷、nfs卷以及静态持久卷的区别
    • 使用websockets中的一些问题和解决方法
    • 数据结构04(Java)-- ( 归并排序及其时间复杂度)
    • gflags框架安装与使用
    • 手机视频怎么提取音频?3步转成MP3,超简单!
    • Vue 中 v-for 的使用及 Vue2 与 Vue3 的区别
    • Vue 3中watch的返回值:解锁监听的隐藏技巧
    • Navicat 无法登录时找回 SQL 文件的方法
    • Tidio实时聊工具
    • Linux上安装PostgreSQL-源码编译安装备份恢复(超详细)
    • 视觉语言导航(4)——强化学习的三种方法 与 优化算法 2.43.4
    • IP白名单、网段白名单
    • Docker小游戏 | 使用Docker部署文字风格冒险网页小游戏
    • 如何选择一个好的软件成分分析工具?
    • 【计算机视觉与深度学习实战】05计算机视觉与深度学习在蚊子检测中的应用综述与假设
    • 【java中springboot引入geotool】
    • apisix负载均衡测试
    • 负载均衡终极指南:从流量分发到云原生架构的核心解析
    • Spring学习笔记:@Async Spring异步任务的深入学习与使用
    • 基于CentOS 7.6搭建GitLab服务器【玩转华为云】
    • TVS二极管选型指南