Opencvヒストグラムとヒストグラム均等化(cv2.calcHist、cv2.equalizeHist)



Opencv Histogram Histogram Equalization Cv2



1.画像ヒストグラムを計算する関数:cv2.calcHist()

cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate ]]) ->hist

imaes:入力画像
チャンネル:画像のチャンネルを選択します
mask:Maskは、画像と同じサイズのnp配列であり、処理が必要な部分は1として指定され、処理が不要な部分は0として指定され、通常はNoneに設定されます。画像全体が処理されること
histSize:使用されるビン(ピラー)の数。通常は256
範囲:ピクセル値の範囲。通常、[0,255]は0〜255を意味します。
後者の2つのパラメーターは基本的に無視されます。
マスクに加えて、他の4つのパラメーターは[]でマークする必要があることに注意してください。
画像

img = cv2.imread('cat.jpg',0) #0 means grayscale image hist = cv2.calcHist([img],[0],None,[256],[0,256]) hist.shape#(256, 1)

1.マスクパラメータなし



img = cv2.imread('cat.jpg') color = ('b','g','r') for i,col in enumerate(color): histr = cv2.calcHist([img],[i],None,[256],[0,256]) plt.plot(histr,color = col) plt.xlim([0,256])

画像
2.マスクパラメータを使用します

# Create mask mask = np.zeros(img.shape[:2], np.uint8) mask[100:300, 100:400] = 255 img = cv2.imread('cat.jpg', 0) masked_img = cv2.bitwise_and(img, img, mask=mask)#And operation hist_full = cv2.calcHist([img], [0], None, [256], [0, 256]) hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256]) plt.subplot(221), plt.imshow(img, 'gray') plt.subplot(222), plt.imshow(mask, 'gray') plt.subplot(223), plt.imshow(masked_img, 'gray') plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask) plt.xlim([0, 256]) plt.show()

画像



2.画像​​ヒストグラム均等化の関数:cv2.equalizeHist()およびcv2.createCLAHA()

ヒストグラム均等化の概要
ヒストグラム均等化は、画像のヒストグラムを変更することによって画像の各ピクセルのグレースケールを変更するシンプルで効果的な画像強調技術であり、主に小さなダイナミックレンジのコントラストで画像を強調するために使用されます。元の画像は、そのグレースケール分布のために狭い間隔に集中する可能性があり、その結果、画像の鮮明さが不十分になります。たとえば、露出オーバーの画像のグレーレベルは高輝度範囲に集中し、露出不足の画像のグレーレベルは低輝度範囲に集中します。ヒストグラム均等化を使用すると、元の画像のヒストグラムを均一に分散された(均等化された)形式に変換できます。これにより、ピクセル間のグレー値の差のダイナミックレンジが拡大し、画像の全体的なコントラストを高める効果が得られます。言い換えると、ヒストグラム均等化の基本原理は、画像内の多数のピクセルでグレー値(つまり、画像で主要な役割を果たすグレー値)を広げ、小さなピクセルでグレー値を拡大することです。ピクセル数(つまり、画像の主な機能ではないグレースケール値)がマージされるため、コントラストが向上し、画像が鮮明になり、強調の目的が達成されます。

cv2.equalizeHist(img)

パラメータの説明:imgは入力画像を表します
画像
画像

img = cv2.imread('clahe.jpg',0) #0 means grayscale image plt.hist(img.ravel(),256) plt.show()

画像



equ = cv2.equalizeHist(img) plt.hist(equ.ravel(),256) plt.show()

画像

res = np.hstack((img,equ)) cv_show(res,'res')

画像この種のグローバルイコライゼーションにもいくつかの問題があります。全体の明るさの改善により、局所画像の細部がぼやけてしまうため、より良い適応等化を使用できます。

cv2.createCLAHA(clipLimit=8.0, titleGridSize=(8, 8))

パラメータの説明:clipLimitの色のコントラストのしきい値、ピクセル等化のtitleGridSizeグリッドサイズ、つまり、ヒストグラムの等化操作を実行するグ​​リッドの数

clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) res_clahe = clahe.apply(img) res = np.hstack((img,equ,res_clahe)) cv_show(res,'res')

画像アダプティブイコライゼーションでは、キャラクターの顔の詳細が消えなかったことがわかります。