在 OpenCV-Python 中绘制直方图
我只是想使用新的 OpenCV Python 接口( cv2 )绘制直方图。
下面是我尝试过的代码:
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)
中的第六行更改为 b,g,r = img[:,:,0], img[:,: ,1], img[:,:,2]
(因为它的工作速度比 cv2.split
快一点)。
现在输出有所不同。下面是输出。
我从两个代码中检查了 b,g,r
的值。他们是一样的。
差异在于cv2.calcHist
的输出。在这两种情况下,hist_item
的结果是不同的。
问题:
这是怎么发生的?为什么输入相同时cv2.calcHist
结果不同?
编辑
我尝试了不同的代码。现在,我的第一个代码的 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)
并且输出与第一个相同。
您可以在此处获取我的原始图像:zzzy.jpg
谢谢。
I was just trying to draw histogram using new OpenCV Python interface ( cv2 ).
Below is the code i tried:
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)
And it works fine. Below is the resulting histogram i obtained.
Then i modified the code a little bit.
ie changed the sixth line in code b,g,r = cv2.split(img)
to b,g,r = img[:,:,0], img[:,:,1], img[:,:,2]
(because it works a little faster than cv2.split
).
Now the output is something different. Below is the output.
I checked the values of b,g,r
from both the codes. They are same.
Difference lies in the output of cv2.calcHist
. Result of hist_item
is different in both the cases.
Question:
How does it happen? Why the result of cv2.calcHist
is different when inputs are same?
EDIT
I tried a different code. Now, a numpy version of my first code.
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)
And the output is same as first one.
You can get my original image here: zzz.jpg
Thank you.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您应该复制数组:
但是,由于 calcHist() 可以接受通道参数,因此您无需将 img 拆分为三个数组。
You should copy the array:
But, since calcHist() can accept channels parameter, you need not to split your img to three array.