[Python] opencv - 什么是直方图?如何绘制图像的直方图?

news/2024/7/2 23:50:11

什么是直方图?

直方图是一种统计图,用于展示数据的分布情况。它将数据按照一定的区间或者组进行划分,然后计算在每个区间或组内的数据频数或频率(即数据出现的次数或占比),然后用矩形或者柱形图的形式将这些频数或频率表示出来。横轴表示数据的区间或组,纵轴表示频数或频率,通过矩形或柱形的高度来表示频数或频率的大小。直方图可以用于直观地展示数据的分布情况,分析数据的集中趋势、离散程度和异常值等。

什么是图像直方图?

图像直方图是用来表示数字图像亮度或颜色分布的统计图。它可以显示图像中每个像素值或像素值范围的频数或频率。图像直方图以横轴表示像素值,纵轴表示像素值的频数或频率。对于灰度图像,直方图展示了每个像素值出现的次数或占比。对于彩色图像,可以将图像分解为红、绿、蓝通道,每个通道的直方图分别表示了该通道像素值的分布情况。

图像直方图可以提供有关图像亮度或颜色分布的重要信息。例如,在灰度图像中,直方图的形状可以反映图像的对比度和明暗程度。在彩色图像中,通过分析不同通道的直方图,可以了解图像的色彩分布情况,例如颜色偏移、色彩饱和度等。图像直方图在图像处理和计算机视觉中广泛应用,用于图像增强、颜色分析、图像检索等任务中。

opencv的calcHist函数介绍

cv2.calcHist()函数是OpenCV中用于计算图像直方图的函数。它的语法如下:

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

参数解释:

  • images:输入的图像,可以是一个图像或图像列表。
  • channels:用于计算直方图的通道编号,如果输入的图像是灰度图像,则通道值为[0];如果是彩色图像,通道值可以是[0]、[1]或[2],分别表示B、G、R通道。
  • mask:可选参数,用于指定感兴趣区域。如果不提供,则计算整个图像的直方图。
  • histSize:直方图的桶数,表示直方图的分组数量。
  • ranges:直方图的像素值范围,通常为[0, 256]。
  • hist:可选参数,用于存储计算得到的直方图。
  • accumulate:可选参数,用于指定是否累加直方图。

返回值:

  • hist:计算得到的直方图。

cv2.calcHist()函数会根据指定的通道和大小,计算输入图像的直方图。可以通过调整参数来计算灰度图像或彩色图像的直方图。计算得到的直方图可以用于图像处理、分析和可视化等应用。

如何灰度图像的直方图?

在Python中,可以使用matplotlib库 + opencv库来绘制灰度图像的直方图。下面是一个简单的示例:

import cv2
import matplotlib.pyplot as plt

# 读取灰度图像
image = cv2.imread('2_0_2_2170.png', 0)

# 计算直方图
histogram = cv2.calcHist([image], [0], None, [256], [0, 256])

# 绘制直方图
plt.figure()
plt.title('Histogram')
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')
plt.plot(histogram)
plt.xlim([0, 256])
plt.show()

在上面的示例中,我们首先使用cv2.imread()函数读取灰度图像。然后,使用cv2.calcHist()函数计算图像的直方图。该函数接受以下参数:图像(以数组的形式传递,所以使用方括号括起来),通道(如果是灰度图像,通道为[0]),掩码(用于指定对哪些像素计算直方图,None表示计算整个图像的直方图),直方图的bin数(256表示每个像素值都有一个bin),像素值范围([0, 256]表示像素值的范围)。最后,使用matplotlib.pyplot库绘制直方图,设置标题、x轴、y轴标签,以及绘制直方图的范围。

运行以上代码,将会显示灰度图像的直方图。你可以根据实际情况修改代码中的图像路径和参数,来绘制不同灰度图像的直方图。

如何绘制彩色图像的直方图?

import cv2
import matplotlib.pyplot as plt

# 读取彩色图像
image = cv2.imread('beauty_01.jpg')

# 将图像从BGR颜色空间转换为RGB颜色空间
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# 将图像展平为一维数组
pixels = image_rgb.reshape(-1, 3)

# 绘制直方图
plt.figure()
plt.title('Histogram')
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')
colors = ('r', 'g', 'b')
for i, color in enumerate(colors):
    histogram = cv2.calcHist([image_rgb], [i], None, [256], [0, 256])
    plt.plot(histogram, color=color)
    plt.xlim([0, 256])
plt.show()

在上述示例中,我们首先使用cv2.imread()函数读取彩色图像。然后,使用cv2.cvtColor()函数将图像从BGR颜色空间转换为RGB颜色空间。接下来,我们使用reshape()函数将图像展平为一维数组,以便于计算直方图。然后,使用cv2.calcHist()函数计算每个颜色通道的直方图。最后,使用matplotlib.pyplot库绘制直方图,设置标题、x轴、y轴标签,以及为每个颜色通道分别绘制直方图。

运行以上代码,将会显示彩色图像的直方图。你可以根据实际情况修改代码中的图像路径和参数,来绘制不同彩色图像的直方图。


http://lihuaxi.xjx100.cn/news/2008494.html

相关文章

K8s 集群可观测性-数据分流最佳实践

简介 在微服务架构下,一个 k8s 集群中经常会部署多套业务,同时也意味着不同团队、不同角色、不同的业务会在同一集群中,需要将不同业务的数据在不同的空间进行管理和查看。 在传统的主机环境下,这个是可以通过不同的主机部署 Da…

力扣每日一题 ---- 1906. 查询差绝对值的最小值

本题中,我们的题目求的是差值的最小值,我们考虑一个因素,当前题目中给出的数组是没有排序过的,那么想要求的差值,是不是要两两配对进行判断差值最小值。这里我们就很费时间了, O(N^2)的时间复杂度&#xf…

2024年第九届信号与图像处理国际会议(ICSIP 2024)

2024第九届信号与图像处理国际会议(ICSIP 2024)将于2024年7月12-14日在中国南京召开。ICSIP每年召开一次,在过去的七年中吸引了1200多名与会者,是展示信号和图像处理领域最新进展的领先国际会议之一。本次将汇集来自亚太国家、北美…

SpringBoot中异步方法的使用

1. 使用CompletableFuture 实例如下: Autowired Resource(name "threadPoolTaskExecutor") private ThreadPoolTaskExecutor threadPoolTaskExecutor;GetMappingpublic String testAsync() {CompletableFuture.supplyAsync(() -> {try {Thread.sleep(10000L);}…

wangEditor v4的简单使用

当前文档是 wangEditor v4 版本的。 wangEditor v5 已经正式发布,可参考文档。 v5 发布之后,v4 将不再开发新功能。 介绍 English documentation wangEditor4 —— 轻量级 web 富文本编辑器,配置方便,使用简单。 官网&#…

jupyter设置环境变量

要在Jupyter中设置环境变量,可以按照以下方法之一进行操作: 1. 在Jupyter Notebook中设置环境变量: - 打开Jupyter Notebook。 - 创建一个新的或打开一个已有的Jupyter Notebook。 - 在Notebook的代码单元格中,使用%env…

C++类和对象入门(二)

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、类的作用域 类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要…

程序员的悲哀:知名Python库requests作者失业了

在当今这个快速发展的科技时代,程序员作为创新的驱动力,一直被视为时代的宠儿。然而,即使在这样一个充满机会的领域,也有着不为人知的辛酸。近日,一个令人震惊的消息传遍了编程社区:知名Python库requests的…