利用python opencv實現圖像自適應二值化

【譯者的話】最近在做一些圖像處理方面的工作,發現對手機拍照的照片進行預處理確實有很多問題,首當其衝的就是實現不同光照條件下自適應的二值化處理,正好找到了這樣一篇文章講到了較爲簡單的方法,翻譯出來給大家共享。原文出自Adaptive Thresholding,發表於2015年1月21日。

對灰度圖像利用閾值得到一個二值化的圖像,是常最常用的圖像處理技術之一。例如,灰度大於127的圖像設置爲1、小於127的設置爲0,這種處理便是固定閾值127的二值化處理。

自適應的二值化處理不同於固定閾值的處理,每個像素的閾值依賴於其鄰近的像素灰度,爲了得到(x,y)點的閾值T(x,y),我們需要進行以下處理。

  1. 在此像素周邊選取一個bxb的區域,其中了是用戶指定的。
  2. 計算此bxb區域的加權平均值。OpenCV提供了兩種方法計算此加權均值,一種是算術平均法,另一種是高斯加權平均法,後者要計算均值時距離區域中心越近權重越大。我們將得到的加權均值計爲WA(x,y)
  3. 將上述加權均值與一固定參數相減得到閾值T(x,y),此固定參數設爲param1,則(x,y)點的閾值可以用下式進行計算:
    T(x,y)=WA(x,y)-param1

這便是得到閾值的過程,下面我們在利用OpenCV庫編程實現固定閾值和自適應閾值的方法,我將在IPython環境下實現。

導入必要的模塊

%pylab
import cv2

讀取圖像

讀取圖像,並把圖像轉換爲灰度圖像並顯示之。

im = imread("/home/bikz05/Desktop/image.jpg")
im_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
axis("off")
title("Input Image")
imshow(im_gray, cmap="gray")
show()

input image

固定閾值二值化

我們首先進行固定閾值二值化處理,固定閾值二值化處理利用cv2.threshold函數,此函數的原型爲:

cv2.threshold(src, thresh, maxval, type[, dst]) -> retval, dst

其中:

  1. src 爲輸入圖像;
  2. thresh 爲閾值;
  3. maxval 爲輸出圖像的最大值;
  4. type 爲閾值的類型;
  5. dst 爲目標圖像。

此例中我們將閾值設置爲50,閾值類型爲cv2.THRESH_BINARY,則灰度在大於50的像素其值將設置爲255,其它像素設置爲0。

retval, im_at_fixed = cv2.threshold(im_gray, 50, 255, cv2.THRESH_BINARY) 
axis("off") 
title("Fixed Thresholding")
imshow(im_at_fixed, cmap = 'gray') 
show()

效果如下:

fixed thresholding

算術平法的自適應二值化

算術平均法的自適應二值化利用cv2.adaptiveThreshold實現,此函數的原型爲:

cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst

其中:

  1. src 爲輸入圖像;
  2. maxval 爲輸出圖像的最大值;
  3. adaptiveMethod 設置爲cv2.ADAPTIVE_THRESH_MEAN_C表示利用算術均值法,設置爲cv2.ADAPTIVE_THRESH_GAUSSIAN_C表示用高斯權重均值法;
  4. thresholdType: 閾值的類型;
  5. blockSize: b的值;
  6. C 爲從均值中減去的常數,用於得到閾值;
  7. dst 爲目標圖像。

此例中我們將b設置爲5,常數設置爲10。

im_at_mean = cv2.adaptiveThreshold(im_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 10)
axis("off")
title("Adaptive Thresholding with mean weighted average")
imshow(im_at_mean, cmap = 'gray') 
show()

得到的結果如下圖所示:

adaptive thresholding with mean weighted average

高斯加權均值法自適應二值化

高斯加權均值法自適應二值化也是利用cv2.adaptiveThreshold, 此函數的原型與上述相同:

cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst

其中:

  1. src 爲輸入圖像;
  2. maxval 爲輸出圖像的最大值;
  3. adaptiveMethod 設置爲cv2.ADAPTIVE_THRESH_MEAN_C表示利用算術均值法,設置爲cv2.ADAPTIVE_THRESH_GAUSSIAN_C表示用高斯權重均值法;
  4. thresholdType: 閾值的類型;
  5. blockSize: b的值;
  6. C 爲從均值中減去的常數,用於得到閾值;
  7. dst 爲目標圖像。
im_at_mean = cv2.adaptiveThreshold(im_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 7)
axis("off")
title("Adaptive Thresholding with gaussian weighted average")
imshow(im_at_mean, cmap = 'gray') 
show()

處理結果如下:

adaptive thresholding with gaussian weighted average

就這麼簡單,顯然自適應方法要比固定閾值的方法效果更好。

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