[再現] OpenCV-Pythonシリーズの画像しきい値(16)

このチュートリアルを始めてから、画像処理の基本的な操作の学習に入りました。いわゆる画像しきい値は、画像の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の技術情報はグループで交換できます〜
ここに画像の説明を挿入

おすすめ

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