我刚刚尝试使用新的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)
并且输出结果与第一个相同。
![在这里输入图片描述](https://istack.dev59.com/RDVoD.webp)
copy
的必要性是什么?calcHist() 接受的 channel 参数是什么意思?它实际上表示什么? - Abid Rahman Kcv2.calcHist([img],[CH],None,[256],[0,255])
来计算图像 img 中通道 CH 的直方图,即 img[:, :, CH]。由于 img[:, :, 0] 中的数据不是连续的,所以你需要复制该数组。 - HYRYnp.ascontiguousarray
函数实现。这只是我的个人意见。 - letmaik