介绍
二值化(英语:Binarization)是图像分割的一种最简单的方法。二值化可以把灰度图像转换成二值图像。把大于某个临界灰度值的像素灰度设为灰度极大值,把小于这个值的像素灰度设为灰度极小值,从而实现二值化。(维基)
图像二值化的意义
参考:https://www.zhihu.com/question/31929651
通常图像二值化的方法有两种:全局阈值、局部阈值
OpenCV中图像二值化方法:
自动计算阈值:OTSU、Traingle
手动确定阈值
自适应阈值(局部阈值)
图像直方图单波峰的情况时使用Traingle计算阈值效果较好,多波峰时Traingle效果较差。
OpenCV中图像二值化的API介绍:
https://www.cnblogs.com/yinliang-liang/p/9293310.html
https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_thresholding/py_thresholding.html
源码:
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_OTSU)
# 自己制定阈值:
# ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY) # 该阈值参数THRESH_BINARY在日常中最常用
# ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY_INV)
# ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_TRUNC)
ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_TOZERO)
print("threshold values %s"%ret)
cv.imshow("binary", binary)
# 使用自适应阈值进行二值化(局部阈值方法)
def local_threshold(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
# 选GAUSSIAN_C可能会跟有效些, blockSize必须是奇数否则报错,C设10,代表
# 只有比均值大10的才设为白色,否则设为黑色,这样做可以减弱噪声的影响。
# binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)
binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_MEAN_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("C:/cvtest/threshold_test.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
# threshold_demo(src)
# local_threshold(src)
custom_threshold(src)
cv.imshow("input image", src)
cv.waitKey(0)
cv.destroyAllWindows()