颜色直方图
颜色直方图是计算机视觉以及图像处理中一个重要的内容,颜色直方图可以反映图像颜色的统计分布以及基本色调,通过颜色直方图可以清晰的看到各个区间的像素有多少。颜色直方图是一种全局特征,反映了图像或某个区域的总体颜色属性,但不敏感于图像的方向和大小变化。在计算机视觉领域,颜色直方图作为一种特征描述子,广泛用于目标跟踪、图像检索等任务。它的优点在于提取简单方便,并且能够有效表示多模态的特征分布。
在OpenCV中使用cv2.calcHist()用于计算图像中的颜色直方图。其中函数中可以使用如下这些参数:
images
:输入图像的指针或数组。channels
:要计算直方图的通道,为通道索引,比如灰度图为[0]mask
:掩码,用于指定图像区域的ROI(感兴趣区域)。histSize
:指定输出直方图的大小。ranges
:像素值的范围。uniform
:是否使用均匀的 bin 大小,默认为 true。accumulate
:是否累加到之前的直方图中,默认为 false。nimages
:输入图像的数量。hist
:输出的直方图。dims
:直方图的维度。
其中前五个参数是必须的,后面几个参数可以可选择使用,但是平时使用较少。
需要注意的是,在OpenCV中,我们一般使用matplotlib库中来绘制直方图,而不是使用imshow来绘制直方图。
例如,下面我们将彩色图片转换为灰色图像来计算其直方图。下面我们有这么一张图:
转换为灰度图像并且绘制灰度图的直方图为:
import cv2
import matplotlib.pyplot as pltimg=cv2.imread(r'D:/Photo/1.jpeg')gray_image=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
hist=cv2.calcHist([gray_image],[0],None,[256],[0,256])
plt.figure()
p=plt.subplot(111)
p.plot(hist
在上面的cv2.calcHIst()中一共有5个参数,将原始图像转换为灰度图之后,该函数的第一个参数[gray_image]是输入图像的列表;第二个参数[0]是我们要计算直方图的通道(在这里是[0]表示灰度通道);第三个参数None是掩码(在这里为None表示整个图像);第四个参数[256]是直方图的大小(在这里是[256]表示有256个bin);第五个参数[0,256]是像素值的范围(在这里是[0, 256]表示从0到255)。最后,我们使用matplotlib库来绘制直方图。
运行结果如下所示:
同样可以绘制多通道的颜色直方图,代码为:
import cv2
import matplotlib.pyplot as plt
import numpy as npimage=cv2.imread(r'D:/Photo/1.jpeg')
arrs=cv2.split(image)
colors=("b","g","r")
p=plt.subplot()
for (arr,color) in zip(arrs,colors):hist=cv2.calcHist([arr],[0],None,[256],[0,256])p.plot(hist,color=color)
plt.show()
如上面代码所示,分别为多个每个通道的内的像素中B通道、G通道以及R通道的各个值,统计其值。
运行结果如下所示:
如上图所示为多通道情况下的颜色直方图,分别为蓝色、绿色以及红色在有一条曲线表示分布在各个值得像素点。
颜色空间转换
在写代码的时候,我们进场会用到的是将彩色图像转换为灰色图像,函数的使用方法为cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)。实际上cvtCOLOR中第二个参数还可以是cv2.COLOR_BGR2HSV以及cv2.COLOR_BGR2LAB。cv2.COLOR_BGR2HSV
在OpenCV中表示将图像从BGR颜色空间转换为HSV颜色空间的操作代码,cv2.COLOR_BGR2LAB
在OpenCV中表示将图像从BGR颜色空间转换为Lab颜色空间的操作代码。
注:
HSV颜色模型是由A. R. Smith在1978年创建的,它依据人类对颜色的直观特性来构建。HSV代表色相(Hue)、饱和度(Saturation)和明度(Value)。
Lab色彩空间是一种与设备无关的颜色模型,它能够包含更广泛的颜色范围。Lab色彩空间是由国际照明委员会(CIE)在1976年提出的,主要用于改进和替代之前的色彩空间,如RGB和CMYK。Lab模式包括三个通道:L代表亮度,a代表从绿色到红色的色度变化,b代表从蓝色到黄色的色度变化。这种色彩空间的特点是:
将原图片分别转换为GRAY图片、HSV图片、LAB图片的代码为:
import cv2img=cv2.imread(r"D:/Photo/1.jpeg")
cv2.imshow('img',img)gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow('GRAY_img',gray_img)hsv_img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
cv2.imshow('HSV_img',hsv_img)lab_img=cv2.cvtColor(img,cv2.COLOR_BGR2LAB)
cv2.imshow('LAB_img',lab_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果如下所示:


如上图所示为原图、GRAY图片、HSV图片和LAB图片。