所以,我抓住了一些示例代码来生成和绘制颜色直方图:http://www.pyimagesearch.com/2014/01/22/clever-girl-a-guide-to-utilizing-color-histograms-for-computer-vision-and-image-search-engines/
from matplotlib import pyplot as plt
import cv2, os, glob
os.chdir(r"....pathname....")
for file in glob.glob("*.jpg"):
image = cv2.imread(file)
chans = cv2.split(image)
colors = ("b", "g", "r")
plt.figure()
plt.title("'Flattened' Color Histogram")
plt.xlabel("Bins")
plt.ylabel("# of Pixels")
for (chan, color) in zip(chans, colors):
hist = cv2.calcHist([chan], [0], None, [256], [0, 256])
cv2.normalize(hist,hist,8,cv2.NORM_MINMAX)
plt.plot(hist, color = color)
plt.xlim([0,256])
plt.savefig(file + '_hist.jpg')
然而对于某些图像,我得到了一个基本平坦的直方图,结尾处于"极端"值,像这样:
这是原始图像,它产生后一个直方图:http://i.imgur.com/xerRgy1.jpg
任何人都可以解释发生了什么以及为什么?
答案 0 :(得分:1)
我使用numpy复制你的代码,以确保它不是cv2做错了什么。虽然看起来很不寻常,但结果实际上与图像一致。
您可以看到红色通道中的花朵具有非常高的值(接近255),并且背景在蓝色通道中具有非常高的值。绿色通道中的像素数量不是很多。
以下是代码:
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
im = np.array(Image.open('im.jpg'))
channelNames=['R','G','B']
fig, axes = plt.subplots(1,3,figsize=(10,4))
for channel, ax in enumerate(axes):
imshow=ax.imshow(im.T[channel].T, cmap=plt.cm.gray, vmin=0, vmax=255)
ax.set_xticks(())
ax.set_yticks(())
ax.set_title(channelNames[channel])
fig.colorbar(imshow,fraction=0.06, pad=0.07, shrink=1.5)
fig.tight_layout()
fig.subplots_adjust(right=0.9)
fig.show()
fig, ax = plt.subplots(1, figsize=(6,4))
for channel in range(3):
cts = np.bincount(im.T[channel].flatten())
bins=np.arange(0,256,1)
ax.plot(bins, cts, c=channelNames[channel])
ax.set_xlabel('Bins')
ax.set_ylabel('# of Pixels')
fig.show()