二值化:固定阈值、自适应阈值、OTSU 算法—opencv实战9
【代码】二值化:固定阈值、自适应阈值、OTSU 算法—opencv实战9。
·
import cv2
import matplotlib.pyplot as plt
# cv2.IMREAD_GRAYSCALE 表示强制读取为单通道灰度图
gray = cv2.imread("bookpage.jpg", cv2.IMREAD_GRAYSCALE)
# 普通全局阈值二值化:一个阈值管整张图,速度最快,但光照不均时效果很差。
# cv2.threshold:全局固定阈值二值化函数
# 参数:灰度图、阈值10、最大值255、二值化模式
# 规则:像素>10 → 255(白),像素≤10 → 0(黑)
# ignore:接收函数返回的阈值(这里没用所以命名为ignore)
# binary:输出二值化后的图像
ignore, binary = cv2.threshold(gray, 10, 255, cv2.THRESH_BINARY)
# 自适应阈值二值化:把图分成很多小块,每个块自己算阈值,完美解决阴影、反光、亮度不均, 适合书页、文档、文字识别。
binary_adaptive = cv2.adaptiveThreshold(
gray, # 输入灰度图
255, # 最大值(白色)
cv2.ADAPTIVE_THRESH_GAUSSIAN_C, # 阈值计算方式:高斯加权平均
cv2.THRESH_BINARY, # 二值化规则
115, # 分块大小(必须奇数),图像分成115x115的小区域
1 # 常量修正值,从计算出的阈值中减去1,微调效果
)
# OTSU 大津法自动阈值:自动算出全局最佳阈值,适合前景背景区分明显的图(双峰直方图)。
# cv2.THRESH_BINARY + cv2.THRESH_OTSU 组合使用
# 阈值设为0,算法会自动算出最佳阈值并存在ret1中
ret1, binary_otsu = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
plt.figure(figsize=(12, 8)) # 设置窗口大小 宽高 英寸
plt.subplot(221), plt.imshow(gray, cmap="gray"), plt.title("Gray") #2行2列中的第1张图
plt.subplot(222), plt.imshow(binary, cmap="gray"), plt.title("Binary") #cmap=gray,让matplotlib用灰度模式显示图像
plt.subplot(223), plt.imshow(binary_adaptive, cmap="gray"), plt.title("Adaptive")
plt.subplot(224), plt.imshow(binary_otsu, cmap="gray"), plt.title("OTSU")
plt.show() # 最终显示

更多推荐
所有评论(0)