自適應閾值:
? 當同一幅圖像上的不同部分的具有<u>不同亮度</u>時。這種情況下我們需要采用自適應閾值。此時的閾值是根據圖像上的每一個小區域計算與其對應的閾值。因此在同一幅圖像上的不同區域采用的是不同的閾值,從而使我們能在亮度不同的情況下得到更好的結果。
cv2.adaptiveThreshold(src,x,adaptive_method, threshold_type,block_size,param1)
參數:
src
:指原圖像,原圖像應該是灰度圖。
x
:指當像素值高于(有時是小于)閾值時應該被賦予的新的像素值
adaptive_method
: CV_ADAPTIVE_THRESH_MEAN_C
或 CV_ADAPTIVE_THRESH_GAUSSIAN_C
threshold_type
: 指取閾值類型:
? 必須是 CV_THRESH_BINARY
, CV_THRESH_BINARY_INV
block_size
: 指用來計算閾值的象素鄰域大小: 3, 5, 7, ...
param1
:指與方法有關的參數。對方法CV_ADAPTIVE_THRESH_MEAN_C
和 CV_ADAPTIVE_THRESH_GAUSSIAN_C
, 它是一個從均值或加權均值提取的常數, 盡管它可以是負數。
自適應閾值:
- 對方法
CV_ADAPTIVE_THRESH_MEAN_C
,先求出塊中的均值,再減掉param1
。
- 對方法
CV_ADAPTIVE_THRESH_GAUSSIAN_C
,先求出塊中的加權和(gaussian), 再減掉param1
。
例:
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("text1.png",0)
# img = cv2.resize(img,(0,0),fx=0.5,fy=0.5)
# 全局閾值
(t,thresh) = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# 自適應閾值
thresh0 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,5,4)
thresh1 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,5,4)
plt.figure(figsize=(8,10))
plt.subplot(221)
plt.imshow(img,cmap="gray")
plt.xlabel("原圖",fontproperties='SimHei')
plt.subplot(222)
plt.imshow(thresh,cmap="gray")
plt.xlabel("OTSU閾值",fontproperties='SimHei')
plt.subplot(223)
plt.imshow(thresh0,cmap="gray")
plt.xlabel("自適應高斯閾值",fontproperties='SimHei')
plt.subplot(224)
plt.imshow(thresh1,cmap="gray")
plt.xlabel("自適應均值閾值",fontproperties='SimHei')
plt.show()
輸出結果:
自適應閾值.png