Abi*_*n K 14 python opencv numpy histogram computer-vision
我只是试图使用新的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)
Run Code Online (Sandbox Code Playgroud)
它工作正常.以下是我获得的结果直方图.

然后我修改了一点代码.
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)
Run Code Online (Sandbox Code Playgroud)
输出与第一个相同.

你可以在这里获得我的原始图像:zzz.jpg
谢谢.
HYR*_*YRY 13
你应该复制数组:
b,g,r = img[:,:,0].copy(), img[:,:,1].copy(), img[:,:,2].copy()
Run Code Online (Sandbox Code Playgroud)
但是,由于calcHist()可以接受通道参数,因此您无需将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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18886 次 |
| 最近记录: |