このチュートリアルを始めてから、画像処理の基本的な操作の学習に入りました。いわゆる画像しきい値は、画像の2値化です。2値化とは、0と1だけで、それ以外は何もありません。OpenCV画像では、2値化とは画像のピクセルが0と255であり、他の値がないことを意味し、グレースケールとは異なります。ただし、必要な画像にGBRの3値チャネルを含めることはできないため、2値化を実現する場合は、最初に画像をグレースケール化することをお勧めします。
単純なしきい値
まず関数プロトタイプを見てみましょう:
ret、dst = cv2.threshold(src、thresh、maxval、type)
src:入力画像。単一チャネル画像のみ入力できます。通常はグレー画像です。
dst:出力マップ
thresh:しきい値
maxval:ピクセル値がしきい値を超える(またはタイプによってはしきい値未満になる)と、割り当てられた値
type:次の5つのタイプを含む2値化演算のタイプ:cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO; cv2.THRESH_TOZERO_INV
この関数は2つの値を返しますが、通常は2値化後の画像を表す2番目の値のみを使用します。
タイプのいくつかの定義を見てみましょう:
例を通して特定の操作について学びます:
view plaincopy to clipboardprint?
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread("cat.jpg",0)
ret,thresh1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
ret,thresh2 = cv.threshold(img,127,255,cv.THRESH_BINARY_INV)
ret,thresh3 = cv.threshold(img,127,255,cv.THRESH_TRUNC)
ret,thresh4 = cv.threshold(img,127,255,cv.THRESH_TOZERO)
ret,thresh5 = cv.threshold(img,127,255,cv.THRESH_TOZERO_INV)
titles = ['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]
for i in range(6):
plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
簡単に比較できるように、5つのパラメーターすべてを一度に示します。複数の画像を描画するには、plt.subplot()関数を使用します。
適応しきい値
これまで説明してきたのは、固定しきい値とも呼ばれる最も単純なしきい値処理方法ですが、その制限は非常に大きいです。次に、その欠点を簡単に確認するために実験を行ってみましょう。次の図を使用します。
前の方法を使用します。
view plaincopy to clipboardprint?
import cv2 as cv
img = cv.imread("text.png",0)
ret,thresh1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
cv.imshow("res",thresh1)
cv.waitKey(0)
cv.destroyAllWindows()
ご覧のとおり、処理された画像は完全に折りたたまれており、次の手順を実行する方法はありません。ただし、これは孤立したケースではなく、固定しきい値処理の欠点は、さまざまな程度の暗さと明るさのイメージをうまく処理できないことです。
ここで、適応2値化を紹介します。固定しきい値2値化処理と比較すると、適応しきい値は固定しきい値を決定する必要はありませんが、画像の局所特性を通じて、対応する適応方法に従って適応できます。 2値化プロセスのしきい値を設定します。
最初に関数を理解しましょう:
dst = cv.adaptiveThreshold(src、maxValue、AdaptiveMethod、thresholdType、blockSize、C [、dst])
src:2値化するイメージ。イメージはCV_8UC1データ型のみにすることができます。
dst:入力画像と同じサイズとデータ型の2値化画像。
maxValue:2値化の最大値。
AdaptiveMethod:しきい値を決定するための自作メソッド。2つのメソッドに分割されます。平均メソッドADAPTIVE_THRESH_MEAN_CとガウスメソッドADAPTIVE_THRESH_GAUSSIAN_Cです。
thresholdType:画像の2値化メソッドのフラグを選択します。これはTHRESH_BINARYおよびTHRESH_BINARY_INVのみにすることができます。
blockSize:しきい値のピクセル近傍サイズを適応的に決定します。通常、奇数は3、5、7です。
C:平均値または加重平均値から減算された定数で、正または負の値になります。
この関数は、ADAPTIVE_THRESH_MEAN_C(平均)とADAPTIVE_THRESH_GAUSSIAN_C(ガウス)の2つのアダプティブメソッドをサポートしています。どちらの場合も、適応しきい値T(x、y)。各ピクセルの周囲のbxbサイズのピクセルブロックの加重平均を計算し、定数Cを差し引くことで得られます。その中で、bはblockSizeによって与えられ、サイズは奇数である必要があります。平均法が使用される場合、すべてのピクセルの周囲の重みは同じです。ガウス法が使用される場合、(x、y)の周囲のピクセルの重みは、中心点の距離はガウス方程式で求めます。
コード例を見てみましょう:
view plaincopy to clipboardprint?
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread('text.png',0)
#自适应阈值
th2 = cv.adaptiveThreshold(
img, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 15, 4)
th3 = cv.adaptiveThreshold(
img, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 15, 8)
cv.imshow("th2",th2)
cv.imshow("th3",th3)
cv.waitKey(0)
最初の画像出力は平均法を使用して取得され、2番目の画像はガウス法を使用して取得されます。
効果は固定閾値法よりもはるかに優れていることがわかります。この方法では、ドキュメントOCRテキスト認識や解答用紙の決定など、多くの例を使用します。 2値化は、後続の操作を容易にするために画像を前処理します。
もちろん、画像のしきい値処理はそれだけでなく、次のチュートリアルで画像しきい値処理の他の方法について説明しますが、それらはより実用的で効果的ですが、それに応じてアルゴリズムも非常に複雑になります。
記事の概要ページを確認してくださいhttps://blog.csdn.net/weixin_44237705/article/details/107864965
openvinoの技術情報はグループで交換できます〜