【Python】图像直方图统计

灰度直方图

灰度直方图概括了图像的灰度级信息,简单的来说就是每个灰度级图像中的像素个数以及占有率,创建直方图无外乎两个步骤,统计直方图数据,再用绘图库绘制直方图。

直方图数据

首先要稍微理解一些与函数相关的术语,方便理解其在 python3 库中的应用和处理。

BINS:如果图像包含有像素值从 0 到 255,则需要 256 个值来显示其直方图。但是,如果不需要知道每个像素值的像素数目,只想知道两个像素值之间的像素点数目怎么办?则可将范围 0 到 255 进行均分,每个分成的范围小组就是一个 BIN 箱。

例如,若只想知道像素值分别在 0 到 15 之间、16 到 31 之间、……、240 到 255 之间的像素点数目,则可以将范围 0 到 255 分成 16 份,每份分别计算总和。

DIMS:数据的参数数目。若对收集到的数据只考虑灰度值,所以该值为 1 。

RANGE:灰度值范围,通常是 [0, 256],也就是灰度所有的取值范围。

绘制直方图

① cv2.imread 函数

函数原型:

cv2.imread(const string & filename, int flag)

参数说明:

  • string & filename:文件名称;
  • flag:取值 0 为将图像转化为灰图;取值 1 为彩图;

② plt.hist 函数

使用 matplotlib 统计直方图数据。

函数原型:

plt.hist(x, bins=10, range=None, normed=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False)

参数说明:

  • x:指定要绘制直方图的数据;
  • bins:指定直方图条形的个数;
  • range:指定直方图数据的上下界,默认包含绘图数据的最大值和最小值;
# import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('/data/image.jpg', 1)
# img_np = np.array(img) 
plt.hist(img.reshape([-1]), 256, [0,256]);
plt.show()

参数说明:matplotlib可视化之直方图plt.hist()与密度图_plot.hist_小文大数据的博客-CSDN博客

③ cv2.calcHist 函数

使用 opencv 统计直方图数据。

函数原型:

cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])

参数说明:

  • images:输入的图像;
  • channels:选择图像的通道。如果输入的图像是灰度图,则它的值就是 [0];如果输入的图像是彩色图像,则它的值可以是 [0] [1] [2],分别对应着 BGR;
  • mask:掩膜是一个大小和 image 一样的 np 数组。可以通过 mask 数组把需要处理的部分指定为 1,不需要处理的部分指定为 0,一般设置为 None,表示处理整幅图像;
  • histSize:使用多少个 bin 柱子,一般为 256;
  • ranges:像素值的范围,一般为 [0, 255] 表示 0~255;
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('/data/image.jpg', 0)
histr = cv2.calcHist([img], [0], None, [256], [0, 256])
plt.plot(histr, color = 'b')
plt.xlim([0, 256])
plt.show()

同时绘制三个通道

enumerate 函数返回当前元素对应的下标,因此 [i] 分别为 [0] [1] [2],从而对应三个通道。

plt.xlim() 函数用于指定 x 轴的作图范围。

import cv2
from matplotlib import pyplot as plt
img = cv2.imread('/data/image.jpg', 1) 

color = ('b','g','r')
for i, col in enumerate(color):
    histr = cv2.calcHist([img], [i], None, [256], [0, 256])
    plt.plot(histr, color = col)
    plt.xlim([0, 256])
plt.show()

猜你喜欢

转载自blog.csdn.net/m0_64140451/article/details/131747969