第三章-OpenCV基础-9-图像阈值

前置内容

发现40例这本书需要结合作者的才能将更好的学习OpenCV,这篇开始开始图像阈值的学习。

阈值是图像处理的重要概念,类似一个"像素值的标准线"。所有的像素点和这个标准线进行比对,最终是或大或小或相等。程序根据这些结果将所有的像素进行分组,然后对某一组的像素值进行"加深"或"变浅"操作,使得整个图像的轮廓更加鲜明,更容易被计算机或者肉眼识别。阈值处理可以有效得处理前景和背景的分离等功能。这里主要介绍简单阈值处理、自适应阈值处理,Otsu阈值处理。

简单阈值处理(固定阈值)

OpenCV提供了threshold()函数进行阈值化处理。

函数语法说明: retval,dst = cv2.threshold( src,thresh,maxval,type )

  • retval : 返回的阈值
  • dst : 返回处理后的图像,大小类型与原始图像等同
  • src : 要进行阈值处理的原图(可以是单通道/多通道),一般选用灰度图
  • thresh : 设置的阈值
  • maxval : 设定的最大值
  • type : 阈值分割的类型,具体规则如下:

类型

中文名

定义

cv2.THRESH_BINARY

二值化阈值处理

dst( x,y ) = src( x,y ) > thresh ? maxval : 0

cv2.THRESH_BINARY_INV

反二值化阈值处理

dst( x,y ) = src( x,y ) > thresh ? 0 : maxval

cv2.THRESH_TRUNC

截断阈值化处理

dst( x,y ) = src( x,y ) > thresh ? thresh : 0

cv2.THRESH_TOZERO_INV

超阈值零处理

dst( x,y ) = src( x,y ) > thresh ? 0 : src( x,y )

cv2.THRESH_TOZERO

低阈值零处理

dst( x,y ) = src( x,y ) > thresh ? src( x,y ) : 0

cv2.THRESH_MASK

掩码处理

掩码

cv2.THRESH_OTSU

最佳阈值处理

标记,使用Otsu算法时的可选阈值参数

cv2.THRESH_TRIANGLE

三角形阈值处理

标记,使用Triangle算法时的可选阈值参数

threshold()提供的阈值处理方法是针对整个图像的像素点进行的统一处理方法,并且阈值是自己设定,根据type的不一样阈值处理也不一样。

  • THRESH_BINARY ---- 二值化阈值处理

dst( x,y ) = src( x,y ) > thresh ? maxval : 0

像素点大于阈值则像素点像素变为设定最大值,否则置为0,最终得到一个只有0和maxval的二值图。

  • THRESH_BINARY_INV ---- 反二值化阈值处理

dst( x,y ) = src( x,y ) >thresh ? 0 : maxval

像素点大于阈值则像素点像素变为0,否则设置为设定最大值,与上面恰好相反,最终也得到一个只有0和maxval二值图。

  • THRESH_TRUNC ---- 截断阈值化处理

dst( x,y ) = src( x,y ) >thresh ? thresh : 0

像素点大于阈值则像素值设为阈值,否则设置为0,最终得到一个只有0和阈值thresh的二值图

  • THRESH_TOZERO_INV ---- 超阈值零处理

dst( x,y ) = src( x,y )> thresh ? 0 : src( x,y )

像素点大于阈值则像素点设为0,否则不变,最终图像中没有大于阈值的像素点(这些像素点变为0了)

  • THRESH_TOZERO ---- 低阈值零处理

dst( x,y ) = src( x,y ) > thresh ? src( x,y ) : 0

像素点大于阈值则像素点不变,否则设为0,最终图像中小于阈值的像素点像素都变成0了

程序如下:

color_0_255 = cv.imread("0_255.png", 0)  # 灰度图像素带
r, b1 = cv2.threshold(color_0_255, 127, 255, cv2.THRESH_BINARY)  # 二进制阈值化:比阈值大设为最大值,否则为0
r, b2 = cv2.threshold(color_0_255, 127, 255, cv2.THRESH_BINARY_INV)  # 反二进制阈值化:比阈值大设为0,否则为最大值
r, b3 = cv2.threshold(color_0_255, 127, 255, cv2.THRESH_TRUNC)  # 截断阈值化:比阈值大的都设置成阈值
r, b4 = cv2.threshold(color_0_255, 127, 255, cv2.THRESH_TOZERO)  # 反阈值化为0:大于阈值的为0
r, b5 = cv2.threshold(color_0_255, 127, 255, cv2.THRESH_TOZERO_INV)  # 阈值化为0:小于阈值则设为0
cv.imshow("orginal 0~255", color_0_255)
cv.imshow("BINARY", b1)
cv.imshow("BINARY_INV", b2)
cv.imshow("TRUNC", b3)
cv.imshow("TOZERO", b4)
cv.imshow("TOZERO_INV", b5)

cv.waitKey()
cv.destroyAllWindows()

程序运行如下:

自适应阈值处理

对于色彩均衡的图像一个阈值就能完成图像的阈值化处理,但对于色彩不均衡的图像,只用一个阈值就无法得到清晰有效的阈值分割图像,于是有了自适应阈值处理方法。

自适应阈值处理适合明暗差异较大的图像,通过计算每个像素点周围临近区域的加权平均值获得阈值,并使用该阈值对当前的像素点进行处理,这样整个过程就是使用变化的阈值进行图像的阈值处理。

函数语法说明: dst = cv2.adaptiveThreshold( src,maxValue,adaptiveMethod,thresholdType,blockSize,C )

  • dst : 自适应阈值的处理结果
  • src : 原始图像,必须是8位单通道的图像
  • maxValue : 最大值
  • adaptiveMethon : 自适应方法,cv2.ADAPTVIVE_THRESH_MEAN_C或cv2.ADAPTIVE_THRESH_GAUSSIAN_C
  • thresholdType : 阈值处理方式,必须是cv2.THRESH_BINARY或者cv2.THRESH_BINARY_INV
  • blockSize : 块大小,标识一个像素在计算阈值时所使用的邻域尺寸,通常为3/5/7
  • C : 常量

自适应阈值等于各个像素由参数blockSize所指定的邻域的加权平均值减去常量C, 邻域的各个点的权重由adaptiveMethon来决定。

adaptiveMethon包括以下参数:

  • cv2.ADAPTVIVE_THRESH_MEAN_C : 邻域所有像素点的权重值一致
  • cv2.ADAPTIVE_THRESH_GAUSSIAN_C : 领域所有像素点的权重值与中心点的距离有关,通过高斯方程得到各个点的权重值

程序如下:

import cv2

image_Gray = cv2.imread("boy.png", 0)
t1, thresh_img = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_BINARY)
# 自适应阈值的计算方法为cv2.ADAPTIVE_THRESH_MEAN_C 邻域权重都一样
athdMEAM = cv2.adaptiveThreshold(image_Gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 3)
# 自适应阈值的计算方法为cv2.ADAPTIVE_THRESH_GAUSSIAN_C 邻域权重为高斯加权
athdGAUS = cv2.adaptiveThreshold(image_Gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 5, 3)
cv2.imshow("image_gray", image_Gray)
cv2.imshow("shreshold_img", thresh_img)
cv2.imshow("MEAN_C", athdMEAM)
cv2.imshow("GAUSSIAN_C", athdGAUS)
cv2.waitKey()
cv2.destroyAllWindows()

运行结果如下:

Otsu阈值处理

针对简单阈值处理设定阈值的一刀切处理方式,大概率设置的阈值不是最优的阈值,得到的处理后图像往往也不是最优的待处理图像。

Otsu阈值处理方式是在cv2.threshold()的type中选择cv2.THRESH_OTSU,同时,设置的阈值也需要改为0,这样此方法会遍历所有可能的阈值,从而找出最佳的阈值并进行阈值分割处理。

程序如下:

import cv2

image_Gray = cv2.imread("p1.png", 0)
t1, thresh_img_127 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_BINARY)
print(t1)  # 127
t2, thresh_otsu = cv2.threshold(image_Gray, 0, 255, cv2.THRESH_OTSU)
print(t2)  # 149
cv2.imshow("image_gray", image_Gray)
cv2.imshow("thresh_img_127", thresh_img_127)
cv2.imshow("thresh_otsu", thresh_otsu)
cv2.waitKey()
cv2.destroyAllWindows()

程序运行如下:

otsu的方法确实比默认设定的127好一些,但是,最好的感觉还是自适应阈值处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr_Sun_01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值