Python+OpenCV圖像處理之圖像二值化


在數字圖像處理中,二值圖像占有非常重要的地位,圖像的二值化使圖像中數據量大為減少,從而能凸顯出目標的輪廓。

該函數的閾值操作屬於像素級的操作,在灰度圖中,每個像素都對應一個灰度值(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-經函數處理過的圖像

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM