一般颜色直方图

文章介绍了颜色直方图在图像分析中的作用,它是展示图像颜色分布的工具。通过使用skimage和matplotlib库,可以计算并显示RGB和HSV颜色空间的直方图,包括概率直方图。此外,文章还展示了如何从RGB转换到HSV颜色空间并分别分析各个通道。
摘要由CSDN通过智能技术生成

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

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

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

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值