新しいOpenCV Pythonインタフェース(cv2)を使用してヒストグラムを描画しようとしたところです。以下はOpenCV-Pythonでのヒストグラムの描画
は、私が試したコードです:
import cv2
import numpy as np
import time
img = cv2.imread('zzz.jpg')
h = np.zeros((300,256,3))
b,g,r = cv2.split(img)
bins = np.arange(256).reshape(256,1)
color = [ (255,0,0),(0,255,0),(0,0,255) ]
for item,col in zip([b,g,r],color):
hist_item = cv2.calcHist([item],[0],None,[256],[0,255])
cv2.normalize(hist_item,hist_item,0,255,cv2.NORM_MINMAX)
hist=np.int32(np.around(hist_item))
pts = np.column_stack((bins,hist))
cv2.polylines(h,[pts],False,col)
h=np.flipud(h)
cv2.imshow('colorhist',h)
cv2.waitKey(0)
、それが正常に動作します。以下は得られた結果のヒストグラムです。
それからコードを少し修正しました。
つまり、コードb,g,r = cv2.split(img)
の第6行がb,g,r = img[:,:,0], img[:,:,1], img[:,:,2]
に変更されました(cv2.split
より少し早く動作するため)。
出力が異なるものです。以下は出力です。
私は両方のコードからb,g,r
の値をチェックします。彼らは同じです。
出力の差はcv2.calcHist
です。 hist_item
の結果はどちらの場合も異なります。
質問:
どのようにそれが起こるのでしょうか?入力が同じ場合、cv2.calcHist
の結果が異なるのはなぜですか?
EDIT
私は別のコードを試してみました。今、私の最初のコードのnumpyバージョンです。
import cv2
import numpy as np
img = cv2.imread('zzz.jpg')
h = np.zeros((300,256,3))
b,g,r = img[:,:,0],img[:,:,1],img[:,:,2]
bins = np.arange(257)
bin = bins[0:-1]
color = [ (255,0,0),(0,255,0),(0,0,255) ]
for item,col in zip([b,g,r],color):
N,bins = np.histogram(item,bins)
v=N.max()
N = np.int32(np.around((N*255)/v))
N=N.reshape(256,1)
pts = np.column_stack((bin,N))
cv2.polylines(h,[pts],False,col,2)
h=np.flipud(h)
cv2.imshow('img',h)
cv2.waitKey(0)
出力は最初と同じです。
あなたはここに私の元の画像を取得することができます:zzz.jpg
ありがとうございました。
「コピー」の必要性は何ですか?そして、calcHist()がチャネルパラメータを受け入れることは何を意味していますか?それは実際に何を表していますか? –
img [:,:、CH]のチャンネルCHのヒストグラムを計算するには、 'cv2.calcHist([img]、[CH]、なし、[256]、[0,255])'を呼び出すことができます。 img [:,:、0]のデータは連続していないので、配列をコピーする必要があります。 – HYRY
あなたはc_contiguousを意味しますか?その意義は何ですか? –