如何使用OpenCV在Python中为灰度图像绘制32位直方图

如何使用OpenCV在Python中为灰度图像绘制32位直方图,python,opencv,histogram,grayscale,Python,Opencv,Histogram,Grayscale,我一直很难为正在处理的640x480灰度图像生成直方图 我使用的是Python 2.7.3、OpenCV 2.4.6(Python绑定)和Numpy 下面的图像是使用可执行软件工具(用C++编程)从同一图像生成的 此直方图的属性为: bins = 50 hist_width = 250 normalised_height_max = 50 因此,图像规格为250x50 我查阅了以下文件: OpenCV中的直方图计算 Hist.py-OpenCV Python示例 第二个参考中的代码编译得

我一直很难为正在处理的640x480灰度图像生成直方图

我使用的是Python 2.7.3、OpenCV 2.4.6(Python绑定)和Numpy

下面的图像是使用可执行软件工具(用C++编程)从同一图像生成的

此直方图的属性为:

bins = 50
hist_width = 250
normalised_height_max = 50

因此,图像规格为250x50

我查阅了以下文件:

OpenCV中的直方图计算

Hist.py-OpenCV Python示例

第二个参考中的代码编译得很好,但是我试图编辑它以获得这些块样式的列,而不是细线,我似乎无法获得正确的结果

import cv2
import numpy as np

cv2.namedWindow('colorhist', cv2.CV_WINDOW_AUTOSIZE)

img = cv2.imread('sample_image.jpg')
h = np.zeros((50,256))

bins = np.arange(32).reshape(32,1)
hist_item = cv2.calcHist([img],0,None,[32],[0,256])
cv2.normalize(hist_item,hist_item,64,cv2.NORM_MINMAX)
hist=np.int32(np.around(hist_item))
pts = np.column_stack((bins,hist))
cv2.polylines(h,[pts],False,(255,255,255))

h=np.flipud(h)

cv2.imshow('colorhist',h)
cv2.waitKey(0)
我的目标是使用以下规格制作直方图:

bins = 32
hist_width = 256
normalised_height_max = 64

如何修复此代码,以便在指定规格的情况下获得如上所示的直方图?

我已设法解决了此问题:

import cv2
import numpy as np

#Create window to display image
cv2.namedWindow('colorhist', cv2.CV_WINDOW_AUTOSIZE)

#Set hist parameters

hist_height = 64
hist_width = 256
nbins = 32
bin_width = hist_width/nbins

#Read image in grayscale mode
img = cv2.imread('sample_image.jpg',0)

#Create an empty image for the histogram
h = np.zeros((hist_height,hist_width))

#Create array for the bins
bins = np.arange(nbins,dtype=np.int32).reshape(nbins,1)

 #Calculate and normalise the histogram
hist_item = cv2.calcHist([img],[0],None,[nbins],[0,256])
cv2.normalize(hist_item,hist_item,hist_height,cv2.NORM_MINMAX)
hist=np.int32(np.around(hist_item))
pts = np.column_stack((bins,hist))

#Loop through each bin and plot the rectangle in white
for x,y in enumerate(hist):
    cv2.rectangle(h,(x*bin_width,y),(x*bin_width + bin_width-1,hist_height),(255),-1)

#Flip upside down
h=np.flipud(h)

#Show the histogram
cv2.imshow('colorhist',h)
cv2.waitKey(0)
结果是:

注意,图像的底部与C++实现略有不同。我想这是因为代码中的某个地方舍入了