python实现图像二值化
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://www.cnblogs.com/ssyfj/p/9272615.html