Python 计算机视觉(七)—— OpevCV进行直方图统计
本文中涉及到的 matplotlib 绘图库的知识可以参考我的之前的文章:Python 绘图库 Matplotlib
目录
1. 直方图概述
(1)基本概念
(2)直方图中的术语
BINS
DIMS
RANGE
2. 直方图绘制
(1)读取图像信息
(2)绘制直方图
灰度图的直方图
彩色图直方图
3. 掩膜直方图
(1)基本概念
(2)实现代码
得到掩模图
绘制掩膜直方图
4. H-S 直方图
(1)基本概念
(2)绘制二维H-S直方图
结束语
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 pltimg0 = 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 pltplt.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 (色调、饱和度、亮度)颜色空间中去
对于HSV空间的介绍可以参考:图像处理(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),至于为什么峰值较少,个人猜测是由于原图中的色彩变化不明显,导致没办法绘制出过多过明显的峰值
结束语
本篇文章简单介绍了图像直方图的概念,并进行了直方图、掩膜直方图、H-S 直方图的绘制,参考的一些文章都添加在了原文中,如果需要深入了解可以点进去进行学习,加油!
Python 计算机视觉(七)—— OpevCV进行直方图统计相关推荐
- [Python图像处理] 三十七.OpenCV直方图统计两万字详解(掩膜直方图、灰度直方图对比、黑夜白天预测)
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...
- Python 计算机视觉(八)—— OpenCV 进行图像增强
参考的一些文章以及论文我都会给大家分享出来 -- 文章链接就贴在原文,论文我上传到资源中去,大家可以免费下载学习,如果当天资源区找不到论文,那就等等,可能正在审核,审核完后就可以下载了.大家一起学习, ...
- python+matplotlib对柿子图的彩色和灰色直方图统计
python+matplotlib对柿子图的彩色和灰色直方图统计 前言 代码 有疑待查 参考链接 前言 最近在对柿子图统计时,遇到了np.histogram函数的参数bins的用法不理解,查找了大量资 ...
- Python计算机视觉——SIFT特征
Python计算机视觉--SIFT特征 文章目录 Python计算机视觉--SIFT特征 写在前面 1 SIFT特征算法步骤 1.1 尺度空间的极值检测 1.2 特征点定位 1.3 特征方向赋值 1. ...
- python计算机视觉编程——基本的图像操作和处理
python计算机视觉编程--第一章(基本的图像操作和处理) 第1章 基本的图像操作和处理 1.1 PIL:Python图像处理类库 1.1.1 转换图像格式--save()函数 1.1.2 创建缩略 ...
- python计算机视觉--基于(BOW)的图像检索与识别
目录 前言 一.基本原理 1.1 图像分类简介 1.2 Bag-of-words模型 1.3 Bag-of-features模型 1.4 Bag-of-features算法 1.5 Bag-of- ...
- Python计算机视觉编程第六章——图像聚类(K-means聚类,DBSCAN聚类,层次聚类,谱聚类,PCA主成分分析)
Python计算机视觉编程 图像聚类 (一)K-means 聚类 1.1 SciPy 聚类包 1.2 图像聚类 1.1 在主成分上可视化图像 1.1 像素聚类 (二)层次聚类 (三)谱聚类 图像聚类 ...
- python计算机视觉编程——基于BOF的图像检索(附代码)
图像检索 一.图像检索 1.1基本原理 1.2 BOW原理简述(同BOF原理) 1.3 基于BOF的图像检索基本流程 1.3.1 sift特征提取 1.3.2 建立视觉单词 1.3.3 K-Means ...
- Python 计算机视觉(十四)—— OpenCV 进行霍夫变换
参考的一些文章以及论文我都会给大家分享出来 -- 链接就贴在原文,论文我上传到资源中去,大家可以免费下载学习,如果当天资源区找不到论文,那就等等,可能正在审核,审核完后就可以下载了.大家一起学习,一起 ...
最新文章
- CVPR2020 Oral | 华为开源只有加法的神经网络,实习生领衔,效果不输传统CNN
- 业界 | 每天1.4亿小时观看时长,Netflix怎样存储这些时间序列数据?
- JVM(3)——Java GC分析
- qrcode——js生成二维码
- 【pmcaff】人人黑产品经理,你中招了嘛!
- Python的slice问题
- 一文看懂深度学习新王者「AutoML」:是什么、怎么用、未来如何发展?
- kubernetes存储详解
- powershell cs上线_BasUSB实现后台静默执行上线CobaltStrike
- 2013年云计算发展展望:混合云即将起飞
- 设备管理(最近考试有考到,就转一下)
- C++11多线程join()和detach()
- 关于protues仿真中的OLED显示模块的使用
- Android 学习博客
- Winform:自定义滚动条——可自定义皮肤
- 每日一坑:加载DLL失败:找不到指定模块
- 语音信号的时域处理(二)
- latex 表格标题分行和居中
- MySQLdb ImportError: libmysqlclient.so.18 No Such File or Directory
- OpenRisc-OptiMSoC
热门文章
- SAP中破解系统管理员密码
- SAP收货后更改采购单价格
- 在SMARTFORMS中取消使用WORD作为编辑器
- GET_GLOBALS_FROM_SLVC_FULLSCR
- 注定一爆就完的ZAO ,为什么只是一剂社交毒药?
- oracle如何创建一个定时任务,怎么创建定时任务
- java 执行cd_Java调用Linux命令(cd的处理)
- mysql过程异常处理_mysql数据库存储过程异常处理
- BUUCTF(pwn)hgame2018_flag_server(简单的栈溢出)
- mysql 创建删除表_mysql创建删除表的实例详解