【複製】OpenCV-PythonシリーズのOTSUアルゴリズム(17)

前のチュートリアルでは、画像を2値化する2つの方法について説明しました。1つは固定しきい値法、もう1つは適応しきい値法ですが、一般に、適応しきい値法はいくつかの点で固定しきい値によるものです。しきい値法ですが、まだ終わりではありませんが、今回はヘビー級プレーヤー、つまりOTSUアルゴリズム(大津アルゴリズムとも呼ばれ、クラス間の最大分散法)を紹介します。

最大クラス間分散法は、1979年に日本の学者である大津によって提案されました。これは、大津法または略してOTSUとも呼ばれる適応しきい値決定法です。画像のグレースケールに基づくグローバルベースの2値化アルゴリズムです。程度特性、画像は前景と背景の2つの部分に分かれています。最適なしきい値が採用された場合、2つの部分の差が最大になるはずですOTSUアルゴリズムで差を測定するために使用される標準は、クラス間の分散の最も一般的な最大値です。前景と背景の間のクラス間の分散が大きい場合、それは画像の2つの部分の差がより大きいことを意味します。ターゲットの一部が誤って背景として分類されたり、背景の一部が誤ってターゲットとして分類されたりすると、2つの部分の間に差異が生じます。しきい値セグメンテーションがクラス間の分散を最大にする場合、減少します。これは、誤分類の確率が最小であることを意味します。

OSTUの原則

大津アルゴリズムでは、重み付き分散と2つのクラスとして定義されたクラスしきい値の最小分散を徹底的に検索できます。
ここに画像の説明を挿入
重みは、2つの別々のクラスの確率しきい値であり、これら2つのクラスの分散です。大津は、クラス内分散の最小化とクラス間分散の最大化が同じであることを証明しました。
ここに画像の説明を挿入

これは、クラス確率クラス平均によって表されます。

クラス確率は、しきい値がtのヒストグラムを使用して計算され
ここに画像の説明を挿入
、クラス平均は次のとおりです。
ここに画像の説明を挿入

クラス確率とクラス平均は繰り返し計算でき、大津のアルゴリズムは0:1の範囲のしきい値を取得しています。このしきい値は、画像に表示されるピクセル強度のダイナミックレンジに使用されます。たとえば、画像に155〜255のピクセル強度しか含まれていない場合、大津しきい値0.75は灰色のしきい値230にマップされます(画像に0〜255の範囲にないピクセルが含まれているため、192ではなく)。

画像I(x、y)の場合、前景(ターゲット)と背景のセグメンテーションしきい値はTとして示され、前景に属するピクセルの画像全体に対する比率はω0として示され、その平均グレーレベルはμ0です。背景ピクセルの数はフレーム全体を占めます画像の比率はω1で、その平均グレースケールはμ1です。画像の総平均グレーレベルはμとして示され、クラス間の分散はgとして示されます。

画像の背景が暗く、画像のサイズがM×Nであると仮定すると、グレー値がしきい値Tより小さい画像のピクセル数はN0として記録され、グレースケールがしきい値Tより大きいピクセル数はN1として記録されます。 :

(1)ω0= N0 /(M×N)

(2)ω1= N1 /(M×N)

(3)N0 + N1 = M×N

(4)ω0+ω1= 1

(5)μ=ω0*μ0+ω1*μ1

(6)g =ω0*(μ0-μ)2 +ω1*(μ1-μ)2

式(5)を式(6)に代入すると、同等の式が得られます。

(7)g =ω0*ω1*(μ0-μ1)2

トラバース法を使用して、クラス間の分散gを最大化するしきい値Tを取得します。

OTSUアルゴリズムの実装

OTSUはバイモーダル画像に使用され、通常、固定しきい値に適用できる画像のグレースケールヒストグラムは単峰型です。
ここに画像の説明を挿入

そして、このヒストグラムの画像に遭遇した場合、非常に重要な情報が除外されます:
ここに画像の説明を挿入

OTSUは、この種のバイモーダル画像に適しています。それ自体で最適なしきい値を見つけることができます。テストの効果を示すために、バイモーダルの画像を見つけました。
ここに画像の説明を挿入

まず、固定しきい値法を使用して実験します。

	view plaincopy to clipboardprint?
import cv2 as cv  
import matplotlib.pyplot as plt  
  
img = cv.imread('sh.jpg',0)  
ret,threshold = cv.threshold(img,60,127,cv.THRESH_BINARY)  
cv.imshow("res",threshold)  
cv.waitKey(0)  
image.png

ここに画像の説明を挿入
OTSUメソッドを試してみましょう。

	view plaincopy to clipboardprint?
import cv2 as cv  
import matplotlib.pyplot as plt  
  
img = cv.imread('sh.jpg',0)  
ret,threshold = cv.threshold(img,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)  
cv.imshow("res",threshold)  
cv.waitKey(0)  

コードに関しては、OTSUを使用する場合、しきい値を設定する必要がないことに注意する必要があります。設定する必要があるのは、最小値0と最大値255だけです。アルゴリズムが計算に最適なしきい値を自動的に検出し
ここに画像の説明を挿入
ます。効果はまだ比較的良好であることがわかります。要約すると、OTSUの長所と短所:

利点:アルゴリズムはシンプルで、ターゲットの領域と背景の領域がそれほど変わらない場合に、画像を効果的に分割できます。

欠点:画像内のターゲットと背景の領域が大きく異なる場合、ヒストグラムに明確な二重ピークがないか、2つのピークのサイズが大きく異なるか、セグメンテーション効果が良くないか、またはターゲットと背景のグレースケールが比較的異なるオーバーラップが大きい場合、ターゲットと背景を正確に分離できません。

理由:この方法は、画像の空間情報を無視し、同時に画像のグレー分布を画像のセグメント化の基準として使用するため、ノイズにも非常に敏感です。

記事の概要ページを確認してくださいhttps://blog.csdn.net/weixin_44237705/article/details/107864965
openvinoの技術情報はグループで交換できます〜
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_44237705/article/details/108233646