2012-02-22 13 views
14

新しい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) 

、それが正常に動作します。以下は得られた結果のヒストグラムです。

enter image description here


それからコードを少し修正しました。

つまり、コードb,g,r = cv2.split(img)の第6行がb,g,r = img[:,:,0], img[:,:,1], img[:,:,2]に変更されました(cv2.splitより少し早く動作するため)。

出力が異なるものです。以下は出力です。

enter image description here


私は両方のコードから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) 

出力は最初と同じです。

enter image description here

あなたはここに私の元の画像を取得することができます:zzz.jpg

ありがとうございました。

答えて

11

あなたは配列にコピーする必要があります

b,g,r = img[:,:,0].copy(), img[:,:,1].copy(), img[:,:,2].copy() 

をしかし、calcHistは()チャンネルパラメータを受け入れることができるので、次の3つの配列にあなたのimgを分割する必要はありません。

import cv2 
import numpy as np 

img = cv2.imread('zzzyj.jpg') 
h = np.zeros((300,256,3)) 

bins = np.arange(256).reshape(256,1) 
color = [ (255,0,0),(0,255,0),(0,0,255) ] 

for ch, col in enumerate(color): 
    hist_item = cv2.calcHist([img],[ch],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) 
+0

「コピー」の必要性は何ですか?そして、calcHist()がチャネルパラメータを受け入れることは何を意味していますか?それは実際に何を表していますか? –

+1

img [:,:、CH]のチャンネルCHのヒストグラムを計算するには、 'cv2.calcHist([img]、[CH]、なし、[256]、[0,255])'を呼び出すことができます。 img [:,:、0]のデータは連続していないので、配列をコピーする必要があります。 – HYRY

+0

あなたはc_contiguousを意味しますか?その意義は何ですか? –

関連する問題