图像二值化的方法:1、全局阈值 2、局部阈值
OpenCV中图像二值化方法:1、OTSU 2、Triangle 3、自动与手动 4、自适应阈值
import cv2 as cv
import numpy as np
# 根据选定的方法自动寻找阈值
def threshold_demo(image):
# 灰度图像
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
# 二值图像
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE)
print('threshold value %s' % ret)
cv.imshow('binary', binary)
# 局部阈值
def local_threshold(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
# blockSize 必须是奇数,下面设为25, 比均值大10(自己设置)就设置为黑色或者白色,在10之内的设置为另一个颜色
dst = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)
cv.imshow('binary', dst)
# 自适应阈值
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)
# 手动设定阈值
def threshold_demo_1(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_TRUNC)
print('threshold value %s' % ret)
cv.imshow('binary', binary)
src = cv.imread('C:/Users/Y/Pictures/Saved Pictures/demo.png')
cv.namedWindow('input image', cv.WINDOW_AUTOSIZE)
cv.imshow('input image', src)
custom_threshold(src)
cv.waitKey(0)
cv.destroyAllWindows()
原图像 threshold_demo二值化后的图像
local_threshold二值化后的图像 custom_threshold二值化后的图像
custom_threshold中的均值
threshold_demo_1二值化后的图像