フロントコンテンツ
この本の 40 の例は、OpenCV をよりよく学習する著者の能力と組み合わせる必要があることがわかり、この記事では画像のしきい値の学習を開始します。
閾値は「画素値の基準線」と同様、画像処理における重要な概念です。すべてのピクセルがこの基準線と比較され、最終的に大きいか小さいか等しいかのいずれかになります。プログラムはこれらの結果に従ってすべてのピクセルをグループ化し、特定のピクセル値のグループに対して「暗くする」または「明るくする」操作を実行して、画像全体の輪郭をより明確にし、コンピューターや裸の人間が認識しやすくします。目。しきい値処理は、前景と背景の分離などの機能を効果的に処理できます。ここでは主に単純閾値処理、適応閾値処理、大津閾値処理について紹介します。
簡易閾値処理(固定閾値)
OpenCV は、しきい値処理のための Threshold() 関数を提供します。
関数構文の説明: retval, dst = cv2.threshold( src, thresh, maxval, type )
- retval : 返すしきい値
- dst : 処理された画像を返します。サイズの種類は元の画像と同じです。
- src : 閾値処理される元の画像 (シングルチャネル/マルチチャネルの可能性があります)、通常はグレースケール画像を選択します
- thresh : 設定する閾値
- maxval : 設定された最大値
- type : しきい値セグメンテーションのタイプ。特定のルールは次のとおりです。
タイプ |
中国語の名前 |
意味 |
cv2.THRESH_BINARY |
二値化の閾値処理 |
dst( x,y ) = src( x,y ) > しきい値 ? 最大値 : 0 |
cv2.THRESH_BINARY_INV |
脱二値化のしきい値 |
dst( x,y ) = src( x,y ) > しきい値 ? 0 : 最大値 |
cv2.THRESH_TRUNC |
切り捨てられたしきい値 |
dst( x,y ) = src( x,y ) > しきい値 ? 閾値:0 |
cv2.THRESH_TOZERO_INV |
スーパーしきい値ゼロ処理 |
dst( x,y ) = src( x,y ) > しきい値 ? 0 : ソース( x,y ) |
cv2.THRESH_TOZERO |
低閾値ゼロ処理 |
dst( x,y ) = src( x,y ) > しきい値 ? src( x,y ) : 0 |
cv2.THRESH_MASK |
マスク処理 |
マスク |
cv2.THRESH_OTSU |
最適なしきい値 |
flag、Otsu のアルゴリズムを使用する場合のオプションのしきい値パラメーター |
cv2.THRESH_TRIANGLE |
三角形のしきい値 |
flag、Triangle アルゴリズムを使用する場合のオプションのしきい値パラメーター |
Threshold()で提供される閾値処理方法は、画像全体の画素に対する統一的な処理方法であり、閾値は独自に設定され、種類に応じて閾値処理が異なる。
- THRESH_BINARY ---- 2値化閾値処理
dst( x,y ) = src( x,y ) > しきい値 ? 最大値 : 0
ピクセルが閾値より大きい場合、ピクセルは設定された最大値になり、それ以外の場合は 0 に設定され、最終的に 0 と maxval だけを持つ 2 値画像が得られます。
- THRESH_BINARY_INV ---- 逆二値化閾値処理
dst( x,y ) = src( x,y ) >thresh ? 0 : 最大値
画素が閾値より大きい場合は0となり、そうでない場合は上記とは逆に設定された最大値に設定され、最終的に0とmaxvalのみの2値画像が得られます。
- THRESH_TRUNC ---- 切り捨てられたしきい値処理
dst( x,y ) = src( x,y ) >thresh ? 閾値:0
ピクセルがしきい値より大きい場合、ピクセル値はしきい値に設定され、それ以外の場合は 0 に設定され、最終的に 0 としきい値 thresh だけを持つ 2 値画像が取得されます。
- THRESH_TOZERO_INV ---- 閾値ゼロ超過処理
dst( x,y ) = src( x,y )> しきい値 ? 0 : ソース( x,y )
ピクセルがしきい値より大きい場合、ピクセルは 0 に設定され、それ以外の場合は変更されず、最終画像にはしきい値を超えるピクセルはありません (これらのピクセルは 0 になります)。
- THRESH_TOZERO ---- 低しきい値ゼロ処理
dst( x,y ) = src( x,y ) > しきい値 ? src( x,y ) : 0
ピクセルがしきい値より大きい場合、ピクセルは変更されません。それ以外の場合、ピクセルは 0 に設定され、最終画像内のしきい値より小さいピクセルは 0 になります。
手順は次のとおりです。
color_0_255 = cv.imread("0_255.png", 0) # 灰度图像素带
r, b1 = cv2.threshold(color_0_255, 127, 255, cv2.THRESH_BINARY) # 二进制阈值化:比阈值大设为最大值,否则为0
r, b2 = cv2.threshold(color_0_255, 127, 255, cv2.THRESH_BINARY_INV) # 反二进制阈值化:比阈值大设为0,否则为最大值
r, b3 = cv2.threshold(color_0_255, 127, 255, cv2.THRESH_TRUNC) # 截断阈值化:比阈值大的都设置成阈值
r, b4 = cv2.threshold(color_0_255, 127, 255, cv2.THRESH_TOZERO) # 反阈值化为0:大于阈值的为0
r, b5 = cv2.threshold(color_0_255, 127, 255, cv2.THRESH_TOZERO_INV) # 阈值化为0:小于阈值则设为0
cv.imshow("orginal 0~255", color_0_255)
cv.imshow("BINARY", b1)
cv.imshow("BINARY_INV", b2)
cv.imshow("TRUNC", b3)
cv.imshow("TOZERO", b4)
cv.imshow("TOZERO_INV", b5)
cv.waitKey()
cv.destroyAllWindows()
プログラムは次のように実行されます。
適応型しきい値処理
色のバランスがとれた画像の場合、1 つのしきい値で画像の二値化を完了できますが、色のバランスが崩れている画像の場合、1 つのしきい値だけでは明確で効果的なしきい値分割画像を取得できないため、適応的なしきい値処理方法があります。
適応型閾値処理は、明暗の差が大きい画像に適しており、各画素の周囲の隣接領域の重み付け平均値を計算して閾値を求め、その閾値を用いて現在の画素を処理することで、全体の処理が行われます。変更された閾値を使用して画像を処理します。
関数構文の説明: dst = cv2.adaptiveThreshold( src, maxValue,adaptiveMethod,thresholdType, blockSize, C )
- dst : 適応閾値の処理結果
- src : 元の画像。8 ビットのシングルチャネル画像である必要があります。
- maxValue : 最大値
- adaptiveMethon : 適応メソッド、cv2.ADAPTVIVE_THRESH_MEAN_C または cv2.ADAPTIVE_THRESH_GAUSSIAN_C
- ThresholdType : しきい値処理方法。 cv2.THRESH_BINARY または cv2.THRESH_BINARY_INV である必要があります。
- blockSize : ブロック サイズ。しきい値を計算するときにピクセルによって使用される近傍サイズを識別します。通常は 3/5/7
- C : 定数
適応閾値は、各ピクセルのパラメータ blockSize で指定された近傍の加重平均値から定数 C を引いたものに等しく、近傍内の各点の重みは、adaptiveMethon によって決定されます。
adaptiveMethon には次のパラメータが含まれます。
- cv2.ADAPTVIVE_THRESH_MEAN_C : 近傍内のすべてのピクセルの重み値は同じです
- cv2.ADAPTIVE_THRESH_GAUSSIAN_C : フィールド内のすべてのピクセルの重み値は中心点からの距離に関連しており、各点の重み値はガウス方程式を通じて取得されます。
手順は次のとおりです。
import cv2
image_Gray = cv2.imread("boy.png", 0)
t1, thresh_img = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_BINARY)
# 自适应阈值的计算方法为cv2.ADAPTIVE_THRESH_MEAN_C 邻域权重都一样
athdMEAM = cv2.adaptiveThreshold(image_Gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 3)
# 自适应阈值的计算方法为cv2.ADAPTIVE_THRESH_GAUSSIAN_C 邻域权重为高斯加权
athdGAUS = cv2.adaptiveThreshold(image_Gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 5, 3)
cv2.imshow("image_gray", image_Gray)
cv2.imshow("shreshold_img", thresh_img)
cv2.imshow("MEAN_C", athdMEAM)
cv2.imshow("GAUSSIAN_C", athdGAUS)
cv2.waitKey()
cv2.destroyAllWindows()
操作の結果は次のようになります。
大津閾値
単純な閾値処理の閾値を設定する画一的な処理方法では、高い確率で設定された閾値が最適な閾値ではなく、得られた処理画像が処理対象として最適な画像ではないことが多い。
Otsu しきい値処理メソッドは、cv2.threshold() のタイプで cv2.THRESH_OTSU を選択することです。同時に、このメソッドが考えられるすべてのしきい値を走査して最適なしきい値を見つけるように、設定されたしきい値も 0 に変更する必要があります。閾値を設定して閾値処理を行う 分割処理
手順は次のとおりです。
import cv2
image_Gray = cv2.imread("p1.png", 0)
t1, thresh_img_127 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_BINARY)
print(t1) # 127
t2, thresh_otsu = cv2.threshold(image_Gray, 0, 255, cv2.THRESH_OTSU)
print(t2) # 149
cv2.imshow("image_gray", image_Gray)
cv2.imshow("thresh_img_127", thresh_img_127)
cv2.imshow("thresh_otsu", thresh_otsu)
cv2.waitKey()
cv2.destroyAllWindows()
プログラムは次のように実行されます。
確かに大津氏の方法はデフォルト設定の 127 よりも優れていますが、最も良い感触は適応閾値処理です。