图像二值化
import cv2 as cv
import numpy as np
“”"
1、 全局阈值函数
cv2.threshold(src, thresh, maxval, type[, dst]) -> retval, dst
参数: src - 输入数组/图像(多通道,8位或32位浮点)
thresh - 阈值
maxval - 最大值,与#THRESH_BINARY和#THRESH_BINARY_INV阈值类型一起使用的最大值(maximum value)
type - 阈值类型
dst - 输出数组/图像(与src相同大小和类型以及相同通道数的数组/图像)。
此外,特殊值#THRESH_OTSU或#THRESH_TRIANGLE可以与上述值之一组合。 在这些情况下,函数使用Otsu或Triangle算法确定最佳阈值,并使用它而不是指定的阈值。
返回值:retval - 阈值 thresh
dst - 经函数处理后的图像 image
“”"
#全局阈值
def threshold_demo(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
# 单个波峰(医学影像)用cv.THRESH_TRIANGLE),多个波峰用cv.THRESH_OTSU
ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY|cv.THRESH_OTSU)
print("threshold value %s"%ret)
cv.imshow("binary", binary)
“”"
2、局部阈值函数
cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst
参数:src-输入图像(8位单通道图像)
maxValue-使用 THRESH_BINARY 和 THRESH_BINARY_INV 的最大值.
adaptiveMethod-自适应阈值算法,平均 (ADAPTIVE_THRESH_MEAN_C)或高斯(ADAPTIVE_THRESH_GAUSSIAN_C)
thresholdType-阈值类型,必须为THRESH_BINARY或THRESH_BINARY_INV的阈值类型
blockSize-块大小(奇数且大于1 )
C-常数,从平均值或加权平均值中减去的数。 通常情况下,这是正值,但也可能为零或负值
返回值:dst-经函数处理过的图像
“”"
#局部阈值
def local_threshold(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
#平均数大于10才变成白色,去除噪声
binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)
cv.imshow("binary", binary)
#自适应阈值
def custom_threshold(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
# 求出宽高
h, w = gray.shape[:2]
# 变成一维数组
m = np.reshape(gray, [1, w*h])
mean = m.sum() / (w*h)
print("mean : ", mean)
ret, binary = cv.threshold(gray, mean, 255, cv.THRESH_BINARY)
cv.imshow("binary", binary)
print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("D:/vcprojects/images/test.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
custom_threshold(src)
cv.waitKey(0)
cv.destroyAllWindows()
阈值类型:
1)二进制阈值化 THRESH_BINARY
2) 反二进制阈值化THRESH_BINARY_INV
3)截断阈值化 THRESH_TRUNC
4) 阈值化为0 THRESH_TOZERO
5) 反阈值化为0 THRESH_TOZERO_INV