撮影状況( 左上だけ照明に照らされている )などで、画像の領域ごとに異なる光源環境になった画像に対して、適応的しきい値処理を行ってみます。また、そのような画像に対しては、単純なしきい値処理では難しいことを結果を比較して確認します。
適応的しきい値処理は、画像を少領域ごとにしきい値を計算するため、領域ごとに光源環境が変わっている画像に対して有効な結果が得られます。
adaptiveThreshold
cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst])
- src – 入力画像(グレースケール)
- maxValue – 条件が満たされるピクセルに割り当てられる0以外の値。詳細は以下を参照
- adaptiveMethod – 使用する適応的なしきい値アルゴリズム
ADAPTIVE_THRESH_MEAN_C
,ADAPTIVE_THRESH_GAUSSIAN_C
cv2.ADAPTIVE_THRESH_MEAN_C – 近傍領域の中央値を採用
cv2.ADAPTIVE_THRESH_GAUSSIAN_C – 近傍領域の重み付け平均値を採用。重みはGaussian分布になるように計算 - thresholdType – しきい値の種別
THRESH_BINARY
,THRESH_BINARY_INV
- blockSize – S ピクセルのしきい値を計算するために利用されるピクセル近傍のサイズ。3, 5, 7などがある
- C – 均値または加重平均値から減算される定数。通常は正の値だた、0や負の値もある
サンプルコード
import cv2
import numpy as np
import matplotlib.pyplot as plt
image = cv2.imread('image.png', 0)
plt.subplot(2, 3, 1)
plt.title('original')
plt.imshow(image, cmap='gray')
ret, th = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
plt.subplot(2, 3, 2)
plt.title('Global Thresholding (v = 127)')
plt.imshow(th, cmap='gray')
th = cv2.adaptiveThreshold(
image, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
plt.subplot(2, 3, 3)
plt.title('Adaptive Mean Thresholding')
plt.imshow(th, cmap='gray')
th = cv2.adaptiveThreshold(
image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
plt.subplot(2, 3, 4)
plt.title('Adaptive Gaussian Thresholding')
plt.imshow(th, cmap='gray')
plt.show()