在數字圖像處理中,二值圖像占有非常重要的地位,圖像的二值化使圖像中數據量大為減少,從而能凸顯出目標的輪廓。
該函數的閾值操作屬於像素級的操作,在灰度圖中,每個像素都對應一個灰度值(0~255,0黑、255白),我們將閾值函數 threshold() 應用於圖像,圖像的灰度值與閾值進行比較,從而實現二值化處理,目的是濾除太大或太小值像素、消除噪聲,從而從灰度圖中獲取二值圖像(將圖像的灰度值設置為0或255),實現增強整個圖像呈現更為明顯的黑白效果,同時也大大減少了數據量。
python實現
import cv2 import numpy as np # 全局閾值 def threshold_demo(image): gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # ret, binary = cv2.threshold(gray,0,255,cv2.THRESH_BINARY | cv2.THRESH_OTSU) # ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_TRIANGLE) # ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_TRUNC) ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) print("閾值:", ret) cv2.imshow("binary", binary) # 局部閾值 def local_threshold(image): gray = cv2.cvtColor(image,cv2.COLOR_BGRA2GRAY) # binary = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,25,10) binary = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 25, 10) cv2.imshow("binary ", binary) def custom_threshold(image): gray = cv2.cvtColor(image,cv2.COLOR_BGRA2GRAY) h, w = gray.shape[:2] m = np.reshape(gray, [1, w*h]) mean = m.sum()/(w*h) # binary = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,25,10) ret, binary = cv2.threshold(gray, mean, 255, cv2.THRESH_BINARY) cv2.imshow("binary ", binary) if __name__ == "__main__": img = cv2.imread("image/img1.jpg") cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE) cv2.imshow("input image", img) custom_threshold(img) cv2.waitKey(0) cv2.destroyAllWindows()
全局閾值函數運行結果
局部閾值函數運行結果
(一)全局閾值函數cv2.threshold(src, thresh, maxval, type[, dst]) -> retval, dst
參數: src - 輸入數組/圖像(多通道,8位或32位浮點)
thresh - 閾值
maxval - 最大值,與#THRESH_BINARY和#THRESH_BINARY_INV閾值類型一起使用的最大值(maximum value)
type - 閾值類型
dst - 輸出數組/圖像(與src相同大小和類型以及相同通道數的數組/圖像)。
此外,特殊值#THRESH_OTSU或#THRESH_TRIANGLE可以與上述值之一組合。 在這些情況下,函數使用Otsu或Triangle算法確定最佳閾值,並使用它而不是指定的閾值。
返回值:retval - 閾值 thresh
dst - 經函數處理后的圖像 image
閾值類型
1)二進制閾值化 THRESH_BINARY
2) 反二進制閾值化THRESH_BINARY_INV
3)截斷閾值化 THRESH_TRUNC
4) 閾值化為0 THRESH_TOZERO
5) 反閾值化為0 THRESH_TOZERO_INV
(二)局部閾值函數cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst
參數:src-輸入圖像(8位單通道圖像)
maxValue-使用 THRESH_BINARY 和 THRESH_BINARY_INV 的最大值.
adaptiveMethod-自適應閾值算法,平均 (ADAPTIVE_THRESH_MEAN_C)或高斯(ADAPTIVE_THRESH_GAUSSIAN_C)
thresholdType-閾值類型,必須為THRESH_BINARY或THRESH_BINARY_INV的閾值類型
blockSize-塊大小(奇數且大於1 )
C-常數,從平均值或加權平均值中減去的數。 通常情況下,這是正值,但也可能為零或負值
返回值:dst-經函數處理過的圖像