在OpenCV-Python中绘制直方图
computer-vision
numpy
opencv
python
5
0

我只是想使用新的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 = 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)

并且输出与第一个相同。

在此处输入图片说明

您可以在此处获得我的原始图像: zzz.jpg

谢谢。

参考资料:
Stack Overflow
收藏
评论
共 1 个回答
高赞 时间 活跃

您应该复制数组:

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

但是,由于calcHist()可以接受channels参数,因此您无需将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)
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号