使用積分圖像進行自適應閾值二值化

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章