Skip to content

Archives

  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年10月
  • 2021年9月

Categories

  • カテゴリーなし
Trend RepositoryArticles and guides
Articles

OpenCV Threshold ( Python , C++ )

On 1月 4, 2022 by admin
  • 画像の閾値処理とは?
  • Threshold Examples: C++とPython
  • 入力画像
  • Binary Thresholding ( type = THRESH_BINARY )
  • Inverse Binary Thresholding ( type = THRESH_BINARY_INV )
  • Truncate Thresholding ( type = THRESH_TRUNC )
  • Threshold to Zero ( type = THRESH_TOZERO )
  • Inverted Threshold to Zero ( type = THRESH_TOZERO_INV)
  • コードとサンプル画像のダウンロード

画像の閾値処理とは?

下のアニメーション(図1)を注意深く観察してください。 いくつの数字が見えますか? ほとんどの方は数字が見えると思います。 32 (そうそう、よく見てください)、64、100、128、180、200、255 です。 しかし、見た目以上のものがあります。

すぐに、元画像の閾値処理されたバージョンを見ることができます。 すべての数字が真っ白に見え(つまりグレースケール値255)、さらに5という数字があることにお気づきでしょう。 元画像のグレースケール値が5だったので、数字の5には気がつかなかったのです。 実は、元の画像に写っているすべての数字は、その数字と同じグレースケール値を持っています。 したがって、255が最も明るく、5が最も暗いのです。

閾値処理された画像の数字を読み取ることは、元の画像の数字を読み取ることよりもずっと簡単なのです。

この投稿は OpenCV 4.4 でテストされました。

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よりもずっと暗く見える。

図2: 入力画像。 クリックすると、別ウィンドウで高解像度 PNG が開きます

すべての例で、疑似コードによる閾値ルールの説明、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で入力画像に二値閾値をかけた結果である。

Figure 3 : Binary Threshold ( thresh = 0 and maxValue = 255)

threshを127に変更すると127以下のすべての数値が削除されます。

Figure 4 : Binary Threshold ( thresh = 127 and maxValue = 255)

maxValueを128に変更すると閾値を設定する領域の値は128となります。

Figure 5: Binary Threshold with maxValue set to 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の逆であることに注意すること。

Figure 6 : Inverse Binary Thresholding ( thresh = 127, maxValue = 0 )

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は無視される。

Figure 7 : Truncate thresholding (thresh = 127)

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);

ゼロへの閾値の結果

Figure 8: Threshold to Zero ( thresh = 127 )

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から数値の値まで数ピクセルで遷移することに起因します。 そのため、境界の画素の一部は閾値以下になっています。

Figure 9: Inverted Threshold to Zero ( thresh = 127 )

コードとサンプル画像のダウンロード

コメントを残す コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

アーカイブ

  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年10月
  • 2021年9月

メタ情報

  • ログイン
  • 投稿フィード
  • コメントフィード
  • WordPress.org
  • DeutschDeutsch
  • NederlandsNederlands
  • SvenskaSvenska
  • DanskDansk
  • EspañolEspañol
  • FrançaisFrançais
  • PortuguêsPortuguês
  • ItalianoItaliano
  • RomânăRomână
  • PolskiPolski
  • ČeštinaČeština
  • MagyarMagyar
  • SuomiSuomi
  • 日本語日本語

Copyright Trend Repository 2022 | Theme by ThemeinProgress | Proudly powered by WordPress