Python+OpenCV图像处理之直方图统计
作者:一马归一码 发布时间:2023-11-19 19:17:31
1. 直方图概述
(1)基本概念
直方图就是对图像的另外一种解释,它描述了整幅图像的灰度分布。直方图的 x 轴代表灰度值(0~255),y 轴代表图片中同一种灰度值的像素点的数目,所以通过直方图我们可以对图像的亮度、灰度分布、对比度等有了一个直观的认识
(2)直方图中的术语
BINS
前面说到,直方图中的 x 轴表示的是灰度值,一幅灰度图的灰度等级有 256 级,所以我们是否需要将每一个等级标注在一条轴上呢?或者如果我们需要的不是每一个灰度值的分布,而是一个范围内的灰度分布呢?所以我们将每一个需要的灰度值范围称为一个 BIN,即所有的灰度等级被分为几个小组,每一个小组是一个 BIN
DIMS
代表的是我们收集的图像的参数的数目,直方图我们如果只收集灰度值一个参数,那么该参数的值就是1
RANGE
代表统计的灰度值的范围,一般的范围是[0-255]
2. 直方图绘制
(1)读取图像信息
在计算机视觉系列的文章中第一件事就是读取图像信息:
"""
Author:XiaoMa
date:2021/10/24
"""
#调用需要的包
import cv2
import matplotlib.pyplot as plt
img0 = cv2.imread('E:\From Zhihu\For the desk\cvseven.jpeg')
img1 = cv2.cvtColor(img0, cv2.COLOR_BGR2GRAY) #转化为灰度图
h, w = img1.shape[:2]
print(h, w)
cv2.namedWindow("W0")
cv2.imshow("W0", img1)
cv2.waitKey(delay = 0)
图像信息如下:
419 636
(2)绘制直方图
绘制直方图使用的函数如下:
hist = cv2.calcHist(images, channels, mask, histSize, ranges, accumulate)
images:原图
channels:指定通道 [0]代表灰度图,如果读入的图像不是灰度图,该值可以是[0],[1],[2]分别代表通道 B,G,R
mask:掩码图像,进行整张图的绘制时为 None
histSize:BIN 的数量
ranges:像素值范围
accumulate:累计标识,一般可以省略
灰度图的直方图
#绘制直方图
hist = cv2.calcHist([img1], [0], None, [256], [0, 255])
plt.plot(hist, color = 'lime', label = '直方图', linestyle = '--')
plt.legend()
plt.savefig('E:\From Zhihu\For the desk\cvseven1.jpeg')
plt.show()
可以看出这幅灰度图中亮度较高的像素点还是占多数的,即整体亮度较高
彩色图直方图
读入彩色图像,并对某一个通道进行直方图绘制
"""
Author:XiaoMa
date:2021/10/24
"""
#调用需要的包
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei' #将全局中文字体改为黑体
img0 = cv2.imread('E:\From Zhihu\For the desk\cvseven.jpeg')
img1 = cv2.cvtColor(img0, cv2.COLOR_BGR2GRAY)
h, w = img1.shape[:2]
print(h, w)
cv2.namedWindow("W0")
cv2.imshow("W0", img0)
cv2.waitKey(delay = 0)
#绘制直方图
hist = cv2.calcHist([img0], [0], None, [256], [0, 255])
plt.plot(hist, color = 'lime', label = '蓝色通道直方图', linestyle = '--', alpha = 1)
plt.legend()
plt.savefig('E:\From Zhihu\For the desk\cvseven1.jpeg')
plt.show()
上图就是对蓝色通道绘制的直方图
3. 掩膜直方图
(1)基本概念
如果我们不需要整幅图像中的直方图,而是某个区域的直方图,我们只需要绘制一幅图,将需要统计的部分设置为白色,不需要统计的部分设置为黑色,就构成了一幅掩膜图像
(2)实现代码
得到掩模图
##得到掩膜图
mask = np.zeros(img0.shape, np.uint8) #将每一个像素点设置为0,就是黑色
mask[109:309, 212:412] = 255 #选取特定区域设置为白色
img0_1 = cv2.bitwise_and(img0, mask) #图像与操作得到掩膜图
cv2.namedWindow("W1")
cv2.imshow("W1", img0_1)
cv2.waitKey(delay = 0)
绘制掩膜直方图
#绘制掩膜直方图
##得到掩膜图
mask = np.zeros(img1.shape, np.uint8) #将每一个像素点设置为0,就是黑色
mask[109:309, 212:412] = 255 #选取特定区域设置为白色
img1_1 = cv2.bitwise_and(img1, mask) #图像与操作得到掩膜图
cv2.namedWindow("W1")
cv2.imshow("W1", img1_1)
cv2.waitKey(delay = 0)
##绘制掩膜直方图和部分图像直方图
hist1 = cv2.calcHist([img1], [0], mask, [256], [0, 255]) #掩膜图直方图,参数需要修改
hist2 = cv2.calcHist([img1], [0], None, [256], [0,255])
plt.plot(hist1, color = 'b', label = '掩膜直方图', linestyle = '--')
plt.plot(hist2, color = 'r', label = '原图直方图', linestyle = '-.')
plt.legend()
plt.savefig('E:\From Zhihu\For the desk\cvseven2.jpeg')
plt.show()
得到的图像如下:
4. H-S 直方图
(1)基本概念
H(Hue) - S(Saturation) 直方图,即色调 - 饱和度直方图
绘制该直方图需要将源RGB图像转化到 HSV (色调、饱和度、亮度)颜色空间中去
img0_2 = cv2.cvtColor(img0, cv2.COLOR_BGR2HSV) #将 RGB 空间转化为 HSV 空间
cv2.namedWindow("W2")
cv2.imshow("W2", img0_2)
cv2.waitKey(delay = 0)
(2)绘制二维H-S直方图
此处参考:OpenCV 官网
##绘制H-S直方图
hist3 = cv2.calcHist ([img0_2], [0, 1], None , [180, 256], [0, 180, 0, 256])#官网给出的解释:channel = [0,1] 因为我们需要同时处理 H 和 S 平面;bins = [180,256] H 平面为 180,S 平面为 256;range = [0,180,0,256] 色调值介于 0 和 180 之间,饱和度介于 0 和 256 之间
plt.imshow(hist3)
plt.savefig('E:\From Zhihu\For the desk\cvseven3.jpeg')
plt.show()
得到的图像如下:
上图中的 X 轴代表S(饱和度),Y轴代表H(色调)
该图中的峰值主要分布在 S 在(0-50)之间 H在(20-80),至于为什么峰值较少,个人猜测是由于原图中的色彩变化不明显,导致没办法绘制出过多过明显的峰值
来源:https://blog.csdn.net/qq_52309640/article/details/120927711


猜你喜欢
- 前言遥感影像分类图一般为特定数值对应一类地物,用Python绘制时,主要在颜色的映射和对应的图例生成。plt.matplotlib.colo
- 1.条件语句几个注意点和C#不一样的。if a < 5 { return 0} else {
- 中文分词(Chinese Word Segmentation),将中文语句切割成单独的词组。英文使用空格来分开每个单词的,而中文单独一个汉字
- 前言使用python做一个加密资料的软件,可加密应用程序、文件、压缩包等多种文件格式,不可直接加密文件夹,可以先用压缩包打包在加密。加密后的
- 1、残差连接是目前常用的组件,解决了大规模深度学习模型梯度消失和瓶颈问题。通常,在10层以上的模型中追加残差连接可能有帮助。from ker
- 在上一篇文章里已经写过如何安装python和在eclipse中配置python插件,这篇就不多说了,开始入门。1.先新建一个python工程
- 做网站数据库,是选SQL Server还是Access好,可能您会说:选MySQL好,不过现在只是讨论IIS+ASP这种架构下的选择,不讨论
- 今天遇到mysql服务1067错误的问题,设置使用系统账户也无法启动mysql,后面认证看了系统的配置信息,发现启动文件也就是mysql安装
- 前言网络摄像头的视频流解析直接使用通过http的Mjpeg是具有边界帧信息的multipart / x-mixed-replace,而jpe
- 测试代码:输出简单的ul li1.asp代码如下:<% response.write "<ul>" r
- 1.在浏览器搜索python.org,如下图选择第一个2.进入python官网,选择dowload然后选择windows如下图:3.选择py
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&
- 区块链实战字节字段说明4版本区块版本号,表示本区块遵守的验证规则32父区块头哈希值前一区块的Merkle树根的哈希值,同样采取SHA256计
- 一、之前解决方案大概是这样:短时间内同一位好友发送了多条消息,当他随便撤回一条消息时,我们不能确定他到底撤回的到底是哪一条消息。只能猜他可能
- 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化. 例如: SELECT /*+AL
- 数据集数据集为Barcelona某段时间内的气象数据,其中包括温度、湿度以及风速等。本文将简单搭建来对风速进行预测。特征构造对于风速的预测,
- RabbitMQ可以当做一个消息代理,它的核心原理非常简单:即接收和发送消息,可以把它想象成一个邮局:我们把信件放入邮箱,邮递员就会把信件投
- 这个目前还是有个别无法显示,翻了下msdn貌似没看到更好的解决方案,暂时放弃继续研究,有晓得完全解决的朋友不妨回复说一声。 先附bat创建畸
- 1.安装MySql目前MySQL有两种形式的文件,一个是msi格式,一个是zip格式的。msi格式的直接点击setup.exe就好,按照步骤
- 好久没有弄JS了,因为我烦里边的大小写。其实和vbs差不多的,不过我看vbs毕竟应用面不广了,呵呵。var w=WScript.create