首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用OpenCV-Python绘制直方图

用OpenCV-Python绘制直方图
EN

Stack Overflow用户
提问于 2012-02-22 07:16:40
回答 1查看 20.7K关注 0票数 15

我只是尝试使用新的OpenCV Python接口( cv2 )绘制直方图。

下面是我尝试过的代码:

代码语言:javascript
复制
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)

而且效果很好。下面是我得到的结果直方图。

然后我对代码做了一点修改。

ie将代码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的结果是不同的?

编辑

我尝试了一种不同的密码。现在,我的第一段代码有了一个粗俗的版本。

代码语言:javascript
复制
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

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-22 07:35:30

您应该复制数组:

代码语言:javascript
复制
b,g,r = img[:,:,0].copy(), img[:,:,1].copy(), img[:,:,2].copy()

但是,由于calcHist()可以接受通道参数,所以不需要将img拆分为三个数组。

代码语言:javascript
复制
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)
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9390592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档