图像二值化(binary)
1.基本概念及API介绍
(1) 全局阈值二值化
ret, binary = cv2.threshold(src: Any, thresh: Any, maxval: Any, type: Any, dst: Any = None)
src: 原图
thresh: 阈值,当阈值类型使用自适应阈值而无固定值时可设为0,不起作用
maxval: 最大值
type: 阈值类型
ret: 阈值
binary: 二值图像
阈值类型 | 介绍 |
---|---|
THRESH_BINARY | 过门限的值设置为maxVal,其它值置零 |
THRESH_BINARY_INV | 过门限的值置零,其它值设置为maxVal |
THRESH_TRUNC | 过门限的值设置为门限值,其它值置不变 |
THRESH_TOZERO | 过门限的值不变,其它值置零 |
THRESH_TOZERO_INV | 过门限的值置零,其它值不变 |
自适应阈值方法:
全局/局部 | 自适应阈值方法 | 介绍 |
---|---|---|
全局 | cv.THRESH_OTSU | 大律法 |
全局 | cv.THRESH_TRIANGLE | 适用于单个波峰 |
注意:
当采用自适应阈值时,thresh无固定值,可设为0,不起作用
示例:cv.THRESH_BINARY | cv.THRESH_OTSU
(2)局部阈值二值化
cv2.adaptiveThreshold(src: Any, maxValue: Any, adaptiveMethod: Any, thresholdType: Any, blockSize: Any, C: Any, dst: Any = None)
src: 原图
maxValue: 最大值
adaptiveMethod: 平均(cv2.ADAPTIVE_THRESH_MEAN_C)或高斯(cv2.ADAPTIVE_THRESH_GAUSSIAN_C)
thresholdType: 必须为THRESH_BINARY或THRESH_BINARY_INV的阈值类型
blockSize: 块大小(奇数且大于1,比如3,5,7… )
C: 常数,表示从平均值或加权平均值中减去的数。 通常情况下,这是正值,但也可能为零或负值。
(3)超大图像二值化
当图像较大时,我们需要将图像进行分块,并在每一块上进行二值化。
当在每个小块上采用全局阈值二值化时,在有噪声的区域可能效果很差。这时我们可以进行空白图像过滤(计算每块的dev值,当dev值小于某个数时,赋值为255)
一般情况下采用局部阈值二值化效果较好。
2.代码示例
import cv2
import numpy as np
book = cv2.imread('E:/PycharmProjects/flower.jpg')
def show(name, img):
cv2.imshow(name, img)
cv2.waitKey(0)
show('flower', book)
# 1.全局阈值
def threshold_demo(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
print('th', ret)
show('binary', binary)
threshold_demo(book)
# 2.局部阈值
def local_threshold(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dst1 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 25, 10)
dst2 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 25, 10)
show('local_gs', dst1)
show('local_mean', dst2)
local_threshold(book)
# 3.自定义阈值
def custom_threshold(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
h, w = gray.shape[:2]
m = np.reshape(gray, [1, h * w])
mean = m.sum() / (h * w)
print(mean)
ret, binary = cv2.threshold(gray, mean, 255, cv2.THRESH_BINARY)
show('custom_binary', binary)
custom_threshold(book)
# 4.超大图像二值化
def big_img_bi(img):
cw = 50
ch = 50
h, w = img.shape[:2]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
for row in range(0, h, ch):
for col in range(0, w, cw):
roi = gray[row:row+ch, col:col+cw]
dst = cv2.adaptiveThreshold(roi, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 5)
gray[row:row + ch, col:col + cw] = dst
show('big_bi', gray)
big_img_bi(book)
cv2.destroyAllWindows()