OpenCV Threshold ( Python , C++ )
On 1月 4, 2022 by admin画像の閾値処理とは?
下のアニメーション(図1)を注意深く観察してください。 いくつの数字が見えますか? ほとんどの方は数字が見えると思います。 32 (そうそう、よく見てください)、64、100、128、180、200、255 です。 しかし、見た目以上のものがあります。
すぐに、元画像の閾値処理されたバージョンを見ることができます。 すべての数字が真っ白に見え(つまりグレースケール値255)、さらに5という数字があることにお気づきでしょう。 元画像のグレースケール値が5だったので、数字の5には気がつかなかったのです。 実は、元の画像に写っているすべての数字は、その数字と同じグレースケール値を持っています。 したがって、255が最も明るく、5が最も暗いのです。
閾値処理された画像の数字を読み取ることは、元の画像の数字を読み取ることよりもずっと簡単なのです。
Computer Vision では、人間にとってタスクを簡単にすると、コンピュータ アルゴリズムにとっても簡単になるのが普通です。
すべての閾値処理アルゴリズムは、入力としてソース画像 (src) と閾値 (thresh) を取り、ソース ピクセル ( x , y ) のピクセル値を閾値と比較することにより出力画像 (dst) を生成します。 src ( x , y ) > thresh の場合,dst ( x , y ) に何らかの値が代入されます. それ以外の場合は、dst ( x , y ) に他の値が割り当てられます。
閾値処理の最も単純な形式は、Binary Thresholding と呼ばれるものです。 元画像(src)と閾値(thresh)の他に、最大値(maxValue )という別の入力パラメータを取ります。 各ピクセル位置(x,y)において,ピクセル値 src ( x , y ) と閾値(thresh)を比較します. src ( x , y ) が thresh よりも大きい場合,出力画像のピクセル dst ( x , y ) の値を maxValue に設定します. それ以外の場合は,0をセットします.
# Simple threshold function pseudo codeif src(x,y) > thresh dst(x,y) = maxValueelse dst(x,y) = 0
より一般的には,src ( x , y ) に適用される閾値の規則の違いによって,dst ( x , y ) を得るための閾値処理には多くの種類が存在します. OpenCV で利用できる様々な閾値の種類を見てみましょう。
Threshold Examples: C++とPython
お急ぎの方は、ダウンロードセクションに飛んで、コードとサンプル画像を入手してください。
入力画像
以下の例では、この画像を入力として使用します。 図2をクリックすると、PNG形式の画像をダウンロードできます。 入力画像には、数字と同じ強さ(グレースケール値)で書かれた数字が含まれています。 例えば、200という数字の画素値は200であり、32という数字の画素値は32である。 そのため、画像上では32は200よりもずっと暗く見える。
すべての例で、疑似コードによる閾値ルールの説明、C++ と python の例、および閾値化された出力画像を提供します。
Binary Thresholding ( type = THRESH_BINARY )
これは最も一般的かつシンプルな閾値処理の型です。
閾値のルール
# Binary Thresholdif src(x,y) > thresh dst(x,y) = maxValueelse dst(x,y) = 0
Python
# import opencvimport cv2# Read imagesrc = cv2.imread("threshold.png", cv2.IMREAD_GRAYSCALE)# Set threshold and maxValuethresh = 0maxValue = 255 # Basic threshold exampleth, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_BINARY);
C++
using namespace cv; // Read imageMat src = imread("threshold.png", IMREAD_GRAYSCALE);Mat dst;// Set threshold and maxValuedouble thresh = 0;double maxValue = 255; // Binary Thresholdthreshold(src,dst, thresh, maxValue, THRESH_BINARY);
二値閾値の結果
図3は、thresh = 0、maxValue = 255で入力画像に二値閾値をかけた結果である。
threshを127に変更すると127以下のすべての数値が削除されます。
maxValueを128に変更すると閾値を設定する領域の値は128となります。
Inverse Binary Thresholding ( type = THRESH_BINARY_INV )
逆バイナリ閾値はバイナリ閾値とちょうど逆のもので、閾値は最大値の128に設定され、バイナリ閾値は閾値の最大値の255に設定されます。 対応するソースピクセルがしきい値より大きい場合、出力ピクセルはゼロに設定され、ソースピクセルがしきい値より小さい場合は、maxValue に設定されます。
閾値ルール
# Inverse Binary Thresholdif src(x,y) > thresh dst(x,y) = 0else dst(x,y) = maxValue
Python
th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_BINARY_INV)
C++
threshold(src,dst, thresh, maxValue, THRESH_BINARY_INV);
逆バイナリ閾値の結果
図6に示す逆バイナリー閾値の結果はまさに図4の逆であることに注意すること。
Truncate Thresholding ( type = THRESH_TRUNC )
このタイプの閾値では、ソースピクセル値より大きい場合に宛先ピクセルに閾値 ( thresh )が設定されます。 maxValueは無視されます。
閾値ルール
# Truncate Thresholdif src(x,y) > thresh dst(x,y) = threshelse dst(x,y) = src(x,y)
Python
th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_TRUNC)
C++
threshold(src,dst, thresh, maxValue, THRESH_TRUNC);
切捨て閾値の結果
図7は入力画像に切捨て閾値を適用した結果であります。 閾値( 127 )以上の値はすべて127に設定され、127以下の値はすべて変更されないことに注意。maxValueは無視される。
Threshold to Zero ( type = THRESH_TOZERO )
この種類の閾値処理は、ソース画素値が閾値より大きい場合、出力画素値は対応するソース画素値と一致するように設定されます。 それ以外の場合は0に設定されます。maxValueは無視されます。
閾値ルール
# Threshold to Zeroif src(x,y) > thresh dst(x,y) = src(x,y)else dst(x,y) = 0
Python
th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_TOZERO)
C++
threshold(src,dst, thresh, maxValue, THRESH_TOZERO);
ゼロへの閾値の結果
Inverted Threshold to Zero ( type = THRESH_TOZERO_INV)
この種の閾値設定では、ソース画素値が閾値より大きい場合、目的画素値がゼロに設定される。 maxValueは無視されます。
閾値ルール
# Inverted Threshold to Zeroif src(x,y) > thresh dst(x,y) = 0else dst(x,y) = src(x,y)
Python
th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_TOZERO_INV)
C++
threshold(src,dst, thresh, maxValue, THRESH_TOZERO_INV);
ゼロへの閾値を反転した結果
図9は入力画像にゼロへの閾値を反転した適用結果を示すものです。 閾値以下の数値はグレースケール値を保持し、閾値以上の数値は境界を除いて0になっています。 境界のアーチファクトは、境界の画素値が0から数値の値まで数ピクセルで遷移することに起因します。 そのため、境界の画素の一部は閾値以下になっています。
コードとサンプル画像のダウンロード
コメントを残す