1.什么是图像二值化

彩色图像: 有blue,green,red三个通道,取值范围均为0-255

灰度图:只有一个通道0-255,所以一共有256种颜色

二值图像:只有两种颜色,黑色和白色,二值化就是把图像的像素转变为0或者255,只有这两个像素值。0白色 1黑色 。0是黑色,255是白色。

2.图像二值化

(1)先获取阈值

(2)根据阈值去二值化图

(3)threshold函数

ret, dst = cv2.threshold(src, thresh, maxval, type)
  • src: 输入图,只能输入单通道图像,通常来说为灰度图
  • dst: 输出图
  • thresh: 阈值
  • maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
  • type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV

(4)全局阈值 -代码实现

 1 # -*- coding=GBK -*-
2 import cv2 as cv
3 import numpy as np
4
5
6 #图像二值化 0白色 1黑色
7 #全局阈值
8 def threshold_image(image):
9 gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
10 cv.imshow("原来", gray)
11
12 ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)#大律法,全局自适应阈值 参数0可改为任意数字但不起作用
13 print("阈值:%s" % ret)
14 cv.imshow("OTSU", binary)
15
16 ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE)#TRIANGLE法,,全局自适应阈值, 参数0可改为任意数字但不起作用,适用于单个波峰
17 print("阈值:%s" % ret)
18 cv.imshow("TRIANGLE", binary)
19
20 ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_BINARY)# 自定义阈值为150,大于150的是白色 小于的是黑色
21 print("阈值:%s" % ret)
22 cv.imshow("自定义", binary)
23
24 ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_BINARY_INV)# 自定义阈值为150,大于150的是黑色 小于的是白色
25 print("阈值:%s" % ret)
26 cv.imshow("自定义反色", binary)
27
28 ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_TRUNC)# 截断 大于150的是改为150 小于150的保留
29 print("阈值:%s" % ret)
30 cv.imshow("截断1", binary)
31
32 ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_TOZERO)# 截断 小于150的是改为150 大于150的保留
33 print("阈值:%s" % ret)
34 cv.imshow("截断2", binary)
35
36 src = cv.imread("C://1.jpg")
37 threshold_image(src)
38 cv.waitKey(0)
39 cv.destroyAllWindows()

函数threshold()的参数说明:

cv.THRESH_BINARY | cv.THRESH_OTSU)#大律法,全局自适应阈值 参数0可改为任意数字但不起作用
    cv.THRESH_BINARY | cv.THRESH_TRIANGLE)#TRIANGLE法,,全局自适应阈值, 参数0可改为任意数字但不起作用,适用于单个波峰
    cv.THRESH_BINARY)# 自定义阈值为150,大于150的是白色 小于的是黑色
    cv.THRESH_BINARY_INV)# 自定义阈值为150,大于150的是黑色 小于的是白色
    cv.THRESH_TRUNC)# 截断 大于150的是改为150  小于150的保留

cv.THRESH_TOZERO)# 截断 小于150的是改为150  大于150的保留

(5)局部阈值 -代码实现

自适应阈值二值化函数根据图片一小块区域的值来计算对应区域的阈值,从而得到也许更为合适的图片。

dst = cv2.adaptiveThreshold(src, maxval, thresh_type, type, Block Size, C)
  • src: 输入图,只能输入单通道图像,通常来说为灰度图
  • dst: 输出图
  • maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
  • thresh_type: 阈值的计算方法,包含以下2种类型:cv2.ADAPTIVE_THRESH_MEAN_C; cv2.ADAPTIVE_THRESH_GAUSSIAN_C.
  • type:二值化操作的类型,与固定阈值函数相同,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV.
  • Block Size: 图片中分块的大小,必须为奇数
  • C :阈值计算方法中的常数项
1 #局部阈值
2 def local_image(image):
3 gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
4 cv.imshow("原来", gray)
5 binary1 = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 25, 10) #blocksize必须为奇数
6 cv.imshow("局部1", binary1)
7 binary2 = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)#高斯处理
8 cv.imshow("局部2", binary2)

(6)自己计算阈值-代码实现

图像的长宽以及灰度、RGB图像的像素原理分布

https://blog.csdn.net/qq_29540745/article/details/70256722

 1 # -*- coding=GBK -*-
2 import cv2 as cv
3 import numpy as np
4
5
6 #求出图像均值作为阈值来二值化
7 def custom_image(image):
8 gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
9 cv.imshow("原来", gray)
10 h, w = gray.shape[:2]
11 m = np.reshape(gray, [1, w*h])#化为一维数组
12 mean = m.sum() / (w*h)
13 print("mean: ", mean)
14 ret, binary = cv.threshold(gray, mean, 255, cv.THRESH_BINARY)
15 cv.imshow("二值", binary)
16
17
18 src = cv.imread("C://1.jpg")
19 custom_image(src)
20 cv.waitKey(0)
21 cv.destroyAllWindows()

参考:

https://blog.csdn.net/u011321546/article/details/79593195

https://blog.csdn.net/Vici__/article/details/100714822#15%E3%80%81%E4%BA%8C%E5%80%BC%E5%8C%96%EF%BC%88cv2.threshold%EF%BC%89

https://www.cnblogs.com/ssyfj/p/9272615.html

 

最新文章

  1. css3+jquery制作3d旋转相册
  2. java设计模式:单例模式
  3. 第一个JAVA创建
  4. SQL语句转摘
  5. (转)Thread.setDaemon设置说明
  6. SpringMVC学习总结(三)——Controller接口详解(1)
  7. VS2012中的全部预定义键盘快捷键列表
  8. J2SE知识点摘记(七)
  9. mysql启动的四种方式
  10. Hibernate 映射字段问题[ImprovedNamingStrategy]
  11. HttpURLConnection碰到连续302跳转的问题的原因及解决方法
  12. 由获取子元素的方法find和children所获
  13. SQL 复习二(数据查询语言)
  14. Python运维开发基础-概述-简介
  15. Mybatis通过注解方式实现批量插入数据库 及 常见的坑
  16. 【CSA49F】【XSY3317】card 博弈论 DP
  17. 【转】Java并发编程:阻塞队列
  18. c#链接access数据库
  19. 分布式协调服务ZooKeeper的典型应用
  20. bootstrap3中container与container_fluid的区别

热门文章

  1. Jetbrains CLion 安装与激活 详解
  2. java 从零开始手写 RPC (05) reflect 反射实现通用调用之服务端
  3. Linux下iptables学习笔记
  4. javascript-jquery对象的事件处理
  5. 【UE4 C++】UObject 创建、销毁、内存管理
  6. OKR与影响地图,别再傻傻分不清
  7. 2021.5.24考试总结 [NOIP模拟3]
  8. 从四个方向分析我们可以从linux学到什么
  9. 【行人惯性导航】关于行人导航中IMU位姿推导的知识点及相关代码
  10. Python | 标识符命名规范