颜色直方图是一种用于图像处理和分析的图表,它可以显示图像中不同颜色的数量。通常,颜色直方图会将颜色分成几个色调区间,每个区间对应一个条形图,其中条形图的高度表示该色调区间中的像素数量。通过颜色直方图,你可以快速了解图像的颜色分布情况。
是图像F中的某一特定颜色的像素个数,图像F像素总个数为
每个特定颜色出现的概率为
整个图像F的颜色直方图可表示为:
n表示某类颜色取值个数。
获取数组:
from skimage import io, exposure
I = io.imread("I1.jpg")
# 计算直方图
R = exposure.histogram(I[:, :, 0], nbins=256)
G = exposure.histogram(I[:, :, 1], nbins=256)
B = exposure.histogram(I[:, :, 2], nbins=256)
RGB颜色直方图:
from skimage import io
import matplotlib.pyplot as plt
def set_ch():
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus'] = False
set_ch()
I = io.imread("I1.jpg")
# 显示
r = I[:, :, 0].flatten()
g = I[:, :, 1].flatten()
b = I[:, :, 2].flatten()
plt.figure("hist", figsize=(8, 8))
plt.subplot(221)
plt.imshow(I)
plt.title("原图")
plt.subplot(222)
plt.hist(r, bins=256, edgecolor='None', facecolor='red')
plt.title("R通道")
plt.subplot(223)
plt.hist(g, bins=256, edgecolor='None', facecolor='red')
plt.title("G通道")
plt.subplot(224)
plt.hist(b, bins=256, edgecolor='None', facecolor='red')
plt.title("B通道")
plt.show()
如何想要显示概率直方图您可以使用
hist
函数并将参数density
设置为True
。这将导致直方图的柱形元素被归一化为概率值,即与所有柱形元素之和等于 1。
from skimage import io
import matplotlib.pyplot as plt
def set_ch():
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus'] = False
set_ch()
I = io.imread("I1.jpg")
# 显示
r = I[:, :, 0].flatten()
g = I[:, :, 1].flatten()
b = I[:, :, 2].flatten()
plt.figure()
plt.imshow(I)
plt.title("原图")
plt.show()
plt.figure()
plt.hist(r, bins=256, edgecolor='None', facecolor='red', density=True)
plt.title("R通道")
plt.show()
plt.figure()
plt.hist(g, bins=256, edgecolor='None', facecolor='red', density=True)
plt.title("G通道")
plt.show()
plt.figure()
plt.hist(b, bins=256, edgecolor='None', facecolor='red', density=True)
plt.title("B通道")
plt.show()
普通颜色直方图是指使用色调(hue)、饱和度(saturation)和亮度(value)三个维度来描述图像颜色的直方图。
色调(hue)表示颜色的基本类型,如红、黄、绿、蓝、紫等。饱和度(saturation)表示颜色的浓度,即颜色的纯度,数值越大,颜色越饱和;数值越小,颜色越灰暗。亮度(value)表示颜色的明暗程度,数值越大,颜色越亮;数值越小,颜色越暗。
HSV颜色直方图:
import matplotlib.pyplot as plt
import numpy as np
from skimage import io
import matplotlib.colors as colors
def set_ch():
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus'] = False
set_ch()
# 假设有一组 RGB 颜色数据,其中每组数据包含三个 0~255 的整数值
I = io.imread("I1.jpg")
# 将 RGB 颜色数据转换为 HSV 格式
hsv_I = np.array([colors.rgb_to_hsv(rgb) for rgb in I])
# 显示
h = hsv_I[:, :, 0].flatten()
s = hsv_I[:, :, 1].flatten()
v = hsv_I[:, :, 2].flatten()
plt.figure()
plt.imshow(I)
plt.title("原图")
plt.show()
plt.figure()
plt.hist(h, bins=180, edgecolor='None', facecolor='red', density=True)
plt.title("H通道")
plt.show()
plt.figure()
plt.hist(s, bins=256, edgecolor='None', facecolor='red', density=True)
plt.title("S通道")
plt.show()
plt.figure()
plt.hist(s, bins=256, edgecolor='None', facecolor='red', density=True)
plt.title("V通道")
plt.show()
也可以使用
skimage
库中的color
模块来实现颜色直方图。首先读入图像数据,然后使用
color.rgb2hsv
函数将图像数据转换为 HSV 格式。接下来,可以使用exposure.histogram
函数计算 H、S 或 V 通道的直方图数据。
import matplotlib.pyplot as plt
from skimage import color, exposure, io
def set_ch():
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus'] = False
set_ch()
# 读入图像数据
image = io.imread('I1.jpg')
# 将图像数据转换为 HSV 格式
hsv_image = color.rgb2hsv(image)
# 计算 不同 通道的直方图数据
H_hist, H_bins = exposure.histogram(hsv_image[:, :, 0])
S_hist, S_bins = exposure.histogram(hsv_image[:, :, 1])
V_hist, V_bins = exposure.histogram(hsv_image[:, :, 2])
# 使用 hist 函数绘制直方图
plt.figure()
plt.hist(H_bins, H_bins, weights=H_hist)
plt.title("H通道")
plt.show()
plt.figure()
plt.hist(S_bins, S_bins, weights=S_hist)
plt.title("S通道")
plt.show()
plt.figure()
plt.hist(V_bins, V_bins, weights=V_hist)
plt.title("V通道")
plt.show()
由于处理方式不同,可能会产生部分数据不一致。