import cv2 as cv
import numpy as np
def adaptive_threshold(gray: np.ndarray, whs: int = None, sub_threshold: float = 0.15):
"""
基於積分圖像的自適應閾值二值化算法
:param gray: 輸入的灰度圖像
:param whs: 滑動窗口的半寬高(默認爲圖像寬度的1/10)
:param sub_threshold: 自定義子閾值,需要通過實驗對比確定
:return: 二值化圖像
"""
# 計算積分圖像
integral_image = cv.integral(gray, cv.CV_32F)
# 創建滑動窗口
height = gray.shape[0]
width = gray.shape[1]
window_half_size = int(width / 10) if whs is None else whs
binary = np.zeros((height, width), dtype=np.uint8)
# 開始二值化
for j in range(height):
for i in range(width):
# 定義滑動窗口的角點
x1 = i - window_half_size
x2 = i + window_half_size
y1 = j - window_half_size
y2 = j + window_half_size
# 檢查滑動窗口的邊界
x1 = 0 if x1 < 0 else x1
y1 = 0 if y1 < 0 else y1
x2 = width - 1 if x2 > width else x2
y2 = height - 1 if y2 > height else y2
count = (x2 - x1) * (y2 - y1)
# \mbox{I}_W=\mbox{I}(x_2,y_2)-\mbox{I}(x_1-1,y_2)-\mbox{I}(x_2,y_1-1)+\mbox{I}(x_1-1,y_1-1)
summed = integral_image[y2, x2] - integral_image[y1, x2] - integral_image[y2, x1] + integral_image[y1, x1]
binary[j, i] = 0 if int(gray[j, i] * count) < int(summed * (1.0 - sub_threshold)) else 255
return binary
使用積分圖像進行自適應閾值二值化
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.