Opencv中封装好了二值化许多方法,例如,全局阈值二值化和局部阈值二值化。二值化方法可以应用在比如图像的前景与背景的分割。
#图像二值化处理
import cv2 as cv
import numpy as np
def threshold_demo(image):
#局部阈值
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
#cv.THRESH_BINARY|cv.THRESH_OTSU表示将图像二值化,
#并且选择的方法为OTSU(最大类间方差法),还有许多其他的方法可以选择。
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY|cv.THRESH_OTSU)
print("threshold value %s"%ret)
cv.imshow("binary", binary)
def local_threshold(image):
#自适应阈值
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
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)
src=cv.imread('F:\OutputResult\SrcImage\saber18.jpg')
print(src.shape)
cv.imshow("Saber",src)
custom_threshold(src)
cv.waitKey(0)
cv.destroyAllWindows()
函数说明:
cv.threshold(src, thresh, maxval, type[, dst])
参数1:src输入数组(多通道、8位或32位浮点)。与src大小、类型和通道数相同的param dst输出数组。
参数2:参数阈值。
参数3:与thresh_binary和thresh_binary_inv阈值一起使用的参数maxval最大值
参数4: 类型。参数类型阈值类型(请参见阈值类型)。如果使用了otsu或三角形方法,则返回计算出的阈值。
cv.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst])
参数1:src源8位单通道图像。dst与src大小和类型相同的dst目标映像。
参数2:为满足条件的像素指定的参数maxvalue非零值
参数3:要使用的参数自适应阈值算法,请参见自适应阈值类型。
参数4:隔离的边界复制用于处理边界。
参数5:参数阈值类型阈值类型必须是阈值二进制或阈值二进制inv,参见阈值类型。
参数6:用于计算阈值的像素邻域的参数块大小,3、5、7等。
参数7:从平均值或加权平均值中减去参数c常数(见下文详情)。通常情况下 为正,但也可以为零或负。
程序结果: