一般颜色直方图

  颜色直方图是一种用于图像处理和分析的图表,它可以显示图像中不同颜色的数量。通常,颜色直方图会将颜色分成几个色调区间,每个区间对应一个条形图,其中条形图的高度表示该色调区间中的像素数量。通过颜色直方图,你可以快速了解图像的颜色分布情况。

s(x_{i})是图像F中的某一特定颜色x_{i}的像素个数,图像F像素总个数为N=\sum_{j}^{}s(x_{j})

每个特定颜色出现的概率为h(x_{i})=\frac{s(x_{i})}{N}=\frac{s(x_{i})}{\sum_{j}^{}s(x_{j})}

整个图像F的颜色直方图可表示为:

H(F)=[h(x_{1}),h(x_{2}),....h(x_{n})] 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()

一般颜色直方图_第1张图片

 如何想要显示概率直方图您可以使用 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()

一般颜色直方图_第2张图片

一般颜色直方图_第3张图片

一般颜色直方图_第4张图片

一般颜色直方图_第5张图片

普通颜色直方图是指使用色调(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()

一般颜色直方图_第6张图片

一般颜色直方图_第7张图片

一般颜色直方图_第8张图片

一般颜色直方图_第9张图片

也可以使用 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()

一般颜色直方图_第10张图片

一般颜色直方图_第11张图片

 一般颜色直方图_第12张图片

由于处理方式不同,可能会产生部分数据不一致。

你可能感兴趣的:(图像处理,计算机视觉,图像处理,人工智能,python)