奇怪的直方图来自cv2

时间:2017-05-03 20:08:45

标签: python opencv matplotlib histogram

所以,我抓住了一些示例代码来生成和绘制颜色直方图: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')

对于大多数图像,我得到一个像这样的体面直观图,例如:

然而对于某些图像,我得到了一个基本平坦的直方图,结尾处于"极端"值,像这样: enter image description here

这是原始图像,它产生后一个直方图:http://i.imgur.com/xerRgy1.jpg

任何人都可以解释发生了什么以及为什么?

1 个答案:

答案 0 :(得分:1)

我使用numpy复制你的代码,以确保它不是cv2做错了什么。虽然看起来很不寻常,但结果实际上与图像一致。

首先,看一下每个频道的图像强度(像素值):enter image description here

您可以看到红色通道中的花朵具有非常高的值(接近255),并且背景在蓝色通道中具有非常高的值。绿色通道中的像素数量不是很多。

计算每个通道的像素值直方图我得到相同的结果:enter image description here

以下是代码:

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()