最新要闻
- 《塞尔达传说:王国之泪》卖爆背后是手游行业的悲哀-全球视讯
- 再见吧!特斯拉强制单踏板模式
- 全球今亮点!“感染”塞尔达病毒后 我每天只睡三小时
- 硬派越野车不适合城市?仰望U8云辇-P出手:三级可调、软硬随心
- ChatGPT估值已上2000亿 创始人对钱没兴趣:收入只够交保险 当前速看
- 23中国中药SCP001今日发布发行公告|当前聚焦
- 全球头条:1美金等于多少人民币元(2023年5月17日)
- 国内又现被驱赶的5G基站:你敢建?我就敢拆!居民称辐射大有害健康|全球热点评
- 开除软件部门全体高管后 大众被曝要用华为车机软件|全球微资讯
- 1TB硬盘只要200元 三星等带头减产闪存 国产存储公司回应:好消息 天天短讯
- 当前要闻:沈阳金融商贸开发区聘请十余位顾问委员会特邀专家
- 四大运营商宣布:我国启动全球首个5G异网漫游试商用
- 国产武侠游戏巅峰 等了16年的《仙剑4重制版》悬了
- OPPO Reno10系列正面颜王:对称双曲面、2.12mm窄下巴 世界快讯
- 前苹果工程师被指控盗窃自动驾驶技术 为中国汽车公司牟利
- ZV-1继承者来了!索尼新款Vlog相机5月23日发布
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
Python从零到壹丨带你了解图像直方图理论知识和绘制实现
摘要:本文将从OpenCV和Matplotlib两个方面介绍如何绘制直方图,这将为图像处理像素对比提供有效支撑。
本文分享自华为云社区《[Python从零到壹] 五十.图像增强及运算篇之图像直方图理论知识和绘制实现》,作者:eastmount。
一.图像直方图理论知识
灰度直方图是灰度级的函数,描述的是图像中每种灰度级像素的个数,反映图像中每种灰度出现的频率。假设存在一幅6×6像素的图像,接着统计其1至6灰度级的出现频率,并绘制如图1所示的柱状图,其中横坐标表示灰度级,纵坐标表示灰度级出现的频率[1-2]。
(资料图)
如果灰度级为0-255(最小值0为黑色,最大值255为白色),同样可以绘制对应的直方图,如图2所示,左边是一幅灰度图像(Lena灰度图),右边是对应各像素点的灰度级频率。
为了让图像各灰度级的出现频数形成固定标准的形式,可以通过归一化方法对图像直方图进行处理,将待处理的原始图像转换成相应的标准形式[3]。假设变量r表示图像中像素灰度级,归一化处理后会将r限定在下述范围:
在灰度级中,r为0时表示黑色,r为1时表示白色。对于一幅给定图像,每个像素值位于[0,1]区间之内,接着计算原始图像的灰度分布,用概率密度函数P®实现。为了更好地进行数字图像处理,必须引入离散形式。在离散形式下,用rk表示离散灰度级,P(rk)代替P®,并满足公式(2)。
公式中,nk为图像中出现rk这种灰度的像素数,n是图像中像素总数,是概率论中的频数,l是灰度级总数(通常l为256级灰度)。接着在直角坐标系中做出rk和P(rk)的关系图,则成为灰度级的直方图[4]。
假设存在一幅3×3像素的图像,其像素值如公式(3)所示,则归一化直方图的步骤如下:
首先统计各灰度级对应的像素个数。用x数组统计像素点的灰度级,y数组统计具有该灰度级的像素个数。其中,灰度为1的像素共3个,灰度为2的像素共1个,灰度为3的像素共2个,灰度为4的像素共1个,灰度为5的像素共2个。
接着统计总像素个数,如公式(5)所示。
最后统计各灰度级的出现概率,通过公式(6)进行计算,其结果如下:
绘制的归一化图行如图3所示,横坐标表示图像中各个像素点的灰度级,纵坐标表示出现这个灰度级的概率。
直方图被广泛应用于计算机视觉领域,在使用边缘和颜色确定物体边界时,通过直方图能更好地选择边界阈值,进行阈值化处理。同时,直方图对物体与背景有较强对比的景物的分割特别有用,可以应用于检测视频中场景的变换及图像中的兴趣点。
二.OpenCV绘制直方图
首先讲解使用OpenCV库绘制直方图的方法。在OpenCV中可以使用calcHist()函数计算直方图,计算完成之后采用OpenCV中的绘图函数,如绘制矩形的rectangle()函数,绘制线段的line()函数来完成。其中,cv2.calcHist()的函数原型及常见六个参数如下:
hist = cv2.calcHist(images, channels, mask, histSize, ranges, accumulate)
- hist表示直方图,返回一个二维数组
- images表示输入的原始图像
- channels表示指定通道,通道编号需要使用中括号,输入图像是灰度图像时,它的值为[0],彩色图像则为[0]、[1]、[2],分别表示蓝色(B)、绿色(G)、红色(R)
- mask表示可选的操作掩码。如果要统计整幅图像的直方图,则该值为None;如果要统计图像的某一部分直方图时,需要掩码来计算
- histSize表示灰度级的个数,需要使用中括号,比如[256]
- ranges表示像素值范围,比如[0, 255]
- accumulate表示累计叠加标识,默认为false,如果被设置为true,则直方图在开始分配时不会被清零,该参数允许从多个对象中计算单个直方图,或者用于实时更新直方图;多个直方图的累积结果用于对一组图像的直方图计算
接下来的代码是计算图像各灰度级的大小、形状及频数,接着调用plot()函数绘制直方图曲线。
# -*- coding: utf-8 -*-# By:Eastmountimport cv2 import numpy as npimport matplotlib.pyplot as pltimport matplotlib#读取图像src = cv2.imread("lena-hd.png")#计算256灰度级的图像直方图hist = cv2.calcHist([src], [0], None, [256], [0,255])#输出直方图大小、形状、数量print(hist.size)print(hist.shape)print(hist)#设置字体matplotlib.rcParams["font.sans-serif"]=["SimHei"]#显示原始图像和绘制的直方图plt.subplot(121)plt.imshow(src, "gray")plt.axis("off")plt.title("(a)Lena灰度图像")plt.subplot(122)plt.plot(hist, color="r")plt.xlabel("x")plt.ylabel("y")plt.title("(b)直方图曲线")plt.show()
上述代码绘制的“Lena”灰度图像所对应的直方图曲线如图4所示,图4(a)表示原图像,图4(b)表示对应的灰度直方图曲线。
同时输出直方图的大小、形状及数量,如下所示:
256(256L, 1L)[[7.000e+00] [1.000e+00] [0.000e+00] [6.000e+00] [2.000e+00] .... [1.000e+00] [3.000e+00] [2.000e+00] [1.000e+00] [0.000e+00]]
彩色图像调用OpenCV绘制直方图的算法与灰度图像一样,只是从B、G、R三个放量分别进行计算及绘制,具体代码如下所示。
# -*- coding: utf-8 -*-# By:Eastmountimport cv2 import numpy as npimport matplotlib.pyplot as pltimport matplotlib#读取图像src = cv2.imread("lena.png")#转换为RGB图像img_rgb = cv2.cvtColor(src, cv2.COLOR_BGR2RGB)#计算直方图histb = cv2.calcHist([src], [0], None, [256], [0,255])histg = cv2.calcHist([src], [1], None, [256], [0,255])histr = cv2.calcHist([src], [2], None, [256], [0,255])#设置字体matplotlib.rcParams["font.sans-serif"]=["SimHei"]#显示原始图像和绘制的直方图plt.subplot(121)plt.imshow(img_rgb, "gray")plt.axis("off")plt.title("(a)Lena原始图像")plt.subplot(122)plt.plot(histb, color="b")plt.plot(histg, color="g")plt.plot(histr, color="r")plt.xlabel("x")plt.ylabel("y")plt.title("(b)直方图曲线")plt.show()
最终绘制的“Lena”彩色图像及其对应的彩色直方图曲线如图5所示,其中图5(a)表示Lena原始图像,图5(b)表示对应的彩色直方图曲线。
三.Matplotlib绘制直方图
Matplotlib是Python强大的数据可视化工具,主要用于绘制各种2D图形。本小节Python绘制直方图主要调用matplotlib.pyplot库中hist()函数实现,它会根据数据源和像素级绘制直方图。其函数主要包括五个常用的参数,如下所示:
n, bins, patches = plt.hist(arr, bins=50, normed=1, facecolor=‘green’, alpha=0.75)
- arr表示需要计算直方图的一维数组
- bins表示直方图显示的柱数,可选项,默认值为10
- normed表示是否将得到的直方图进行向量归一化处理,默认值为0
- facecolor表示直方图颜色
- alpha表示透明度
- n为返回值,表示直方图向量
- bins为返回值,表示各个bin的区间范围
- patches为返回值,表示返回每个bin里面包含的数据,是一个列表
图像直方图的Python实现代码如下所示,该示例主要是通过matplotlib.pyplot库中的hist()函数绘制的。注意,读取的“lena-hd.png”图像的像素为二维数组,而hist()函数的数据源必须是一维数组,通常需要通过函数ravel()拉直图像。
# -*- coding: utf-8 -*-# By:Eastmountimport cv2 import numpy as npimport matplotlib.pyplot as plt#读取图像src = cv2.imread("lena-hd.png")#绘制直方图plt.hist(src.ravel(), 256)plt.xlabel("x")plt.ylabel("y")plt.show()#显示原始图像cv2.imshow("src", src)cv2.waitKey(0)cv2.destroyAllWindows()
读取显示的“lena”灰度图像如图6所示。
最终的灰度直方图如图7所示,它将Lena图256级灰度和各个灰度级的频数绘制出来,其中x轴表示图像的256级灰度,y轴表示各个灰度级的频数。
如果调用下列函数,则绘制的直方图是经过标准化处理,并且颜色为绿色、透明度为0.75的直方图,如图8所示。
plt.hist(src.ravel(), bins=256, density=1, facecolor=‘green’, alpha=0.75)
彩色直方图是高维直方图的特例,它统计彩色图片RGB各分量出现的频率,即彩色概率分布信息。彩色图片的直方图和灰度直方图一样,只是分别画出三个通道的直方图,然后再进行叠加,其代码如下所示。Lena彩色原始图像如图9所示。
# -*- coding: utf-8 -*-# By:Eastmountimport cv2 import numpy as npimport matplotlib.pyplot as plt#读取图像src = cv2.imread("Lena.png")#获取BGR三个通道的像素值b, g, r = cv2.split(src)#绘制直方图plt.figure("Lena")#蓝色分量plt.hist(b.ravel(), bins=256, density=1, facecolor="b", edgecolor="b", alpha=0.75)#绿色分量plt.hist(g.ravel(), bins=256, density=1, facecolor="g", edgecolor="g", alpha=0.75)#红色分量plt.hist(r.ravel(), bins=256, density=1, facecolor="r", edgecolor="r", alpha=0.75)plt.xlabel("x")plt.ylabel("y")plt.show()#显示原始图像cv2.imshow("src", src)cv2.waitKey(0)cv2.destroyAllWindows()
绘制的彩色直方图如图10所示,包括红色、绿色、蓝色三种对比。
如果希望将三个颜色分量的柱状图分开绘制并进行对比,则使用下面的代码实现,调用plt.figure(figsize=(8, 6))函数绘制窗口,以及plt.subplot()函数分别绘制4个子图。
# -*- coding: utf-8 -*-# By:Eastmountimport cv2 import numpy as npimport matplotlib.pyplot as pltimport matplotlib#读取图像src = cv2.imread("lena.png")#转换为RGB图像img_rgb = cv2.cvtColor(src, cv2.COLOR_BGR2RGB)#获取BGR三个通道的像素值b, g, r = cv2.split(src)print(r,g,b)plt.figure(figsize=(8, 6))#设置字体matplotlib.rcParams["font.sans-serif"]=["SimHei"]#原始图像plt.subplot(221)plt.imshow(img_rgb)plt.axis("off")plt.title("(a)原图像")#绘制蓝色分量直方图plt.subplot(222)plt.hist(b.ravel(), bins=256, density=1, facecolor="b", edgecolor="b", alpha=0.75)plt.xlabel("x")plt.ylabel("y")plt.title("(b)蓝色分量直方图")#绘制绿色分量直方图plt.subplot(223)plt.hist(g.ravel(), bins=256, density=1, facecolor="g", edgecolor="g", alpha=0.75)plt.xlabel("x")plt.ylabel("y")plt.title("(c)绿色分量直方图")#绘制红色分量直方图plt.subplot(224)plt.hist(r.ravel(), bins=256, density=1, facecolor="r", edgecolor="r", alpha=0.75)plt.xlabel("x")plt.ylabel("y")plt.title("(d)红色分量直方图")plt.show()
最终输出的图形如图11所示,,图11(a)表示原图像,图11(b)表示蓝色分量直方图,图11©表示绿色分量直方图,图11(d)表示红色分类直方图。
四.总结
本文主要讲解图像直方图理论知识以及直方图绘制方法,并且包括Matplotlib和OpenCV两种统计及绘制方法。灰度直方图是灰度级的函数,描述的是图像中每种灰度级像素的个数,反映图像中每种灰度出现的频率。这篇文章的知识点将为后续图像处理和图像运算对比提供支撑。
参考文献:
- [1] 冈萨雷斯. 数字图像处理(第3版)[M]. 北京:电子工业出版社, 2013.
- [2] 张恒博, 欧宗瑛. 一种基于色彩和灰度直方图的图像检索方法[J]. 计算机工程, 2004.
- [3] Eastmount. [数字图像处理] 四.MFC对话框绘制灰度直方图[EB/OL]. (2015-05-31). https://blog.csdn.net/eastmount/article/details/46237463.
- [4] 阮秋琦. 数字图像处理学(第3版)[M]. 北京:电子工业出版社, 2008.
- [5] Eastmount. [Python图像处理] 十一.灰度直方图概念及OpenCV绘制直方图[EB/OL]. (2018-11-06). https://blog.csdn.net/Eastmount/article/details/83758402.
点击关注,第一时间了解华为云新鲜技术~
关键词:
Python从零到壹丨带你了解图像直方图理论知识和绘制实现
匠心精神--来看一个小迭代的代码实现
《塞尔达传说:王国之泪》卖爆背后是手游行业的悲哀-全球视讯
再见吧!特斯拉强制单踏板模式
全球今亮点!“感染”塞尔达病毒后 我每天只睡三小时
硬派越野车不适合城市?仰望U8云辇-P出手:三级可调、软硬随心
ChatGPT估值已上2000亿 创始人对钱没兴趣:收入只够交保险 当前速看
23中国中药SCP001今日发布发行公告|当前聚焦
全球头条:1美金等于多少人民币元(2023年5月17日)
国内又现被驱赶的5G基站:你敢建?我就敢拆!居民称辐射大有害健康|全球热点评
开除软件部门全体高管后 大众被曝要用华为车机软件|全球微资讯
1TB硬盘只要200元 三星等带头减产闪存 国产存储公司回应:好消息 天天短讯
全球观焦点:企业级项目模板的配置与集成(Vite + Vue3 + TypeScript)
智能家居生态迎来超强辅助 快资讯
当前要闻:沈阳金融商贸开发区聘请十余位顾问委员会特邀专家
四大运营商宣布:我国启动全球首个5G异网漫游试商用
国产武侠游戏巅峰 等了16年的《仙剑4重制版》悬了
OPPO Reno10系列正面颜王:对称双曲面、2.12mm窄下巴 世界快讯
前苹果工程师被指控盗窃自动驾驶技术 为中国汽车公司牟利
ZV-1继承者来了!索尼新款Vlog相机5月23日发布
我国成功发射第五十六颗北斗导航卫星 全球观点
数据结构-环球速递
【世界热闻】提高数据的安全性和可控性,数栈基于 Ranger 实现的 Spark SQL 权限控制实践之路
环球看点!Django authenticate() 函数查找不到与提交的用户名和密码匹配的用户,则会返回 None。
apb uart IP使用说明
微软反驳马斯克:我们并没有控制OpenAI
频繁翻车、流量不再 为何明星代言手机越来越少了?
环球要闻:20年来重大转变 马斯克将花钱为特斯拉打广告
边开边充!瑞典率先打造世界首条永久性充电公路 头条
病人被医生遗忘在磁共振舱近三小时 属重大医疗事故 科普:没辐射
全球新动态:【道德经】五十·出生入死
NineData:高效高质量的 Redis 可视化管理工具|今热点
如何在不改变图片分辨率的情况下增加图片的大小
今日讯!国家发展改革委与标普评级公司召开座谈会 开展我国主权信用评级复评工作
最新70城房价出炉,4月份郑州新房同比增长0.2%
孟羽童图文广告报价至少15万一条 网友称其已赚近300万-世界聚看点
屏幕良心了 Redmi Book 14用上2.8K 120Hz:告别万年FHD 60Hz 当前观察
自主品牌崛起 国人依然爆买BBA等豪华车 30万以上增速翻倍-全球视讯
一特斯拉高速堵车任性变至应急车道:差点蹭翻执勤车辆
火爆!华为Mate X3出货目标翻倍:修改为超300万台-世界消息
保障口岸快捷通道恢复通关
热点聚焦:简单聊两句前端模块化
【天天聚看点】2023蝶变志愿免费版有没有 软件好用吗靠谱吗
消息称特斯拉申请扩建上海超级工厂:将首次生产软包电池 全球观速讯
马斯克“抢功”:没有我就没有OpenAI ChatGPT
档位天花板!荣耀90系列官宣:全新镜头惊艳
淘汰老头乐!两部门支持农村购买新能源汽车 提供以旧换新奖励|世界时快讯
天热必备:匹克夏季针织短裤34元官方冲量(65元优惠券)_今热点
世界快资讯:《守望先锋2》PVE英雄模式取消:开发没有取得预期进展
Vuex的使用 环球通讯
最低已跌至5.5% 上市券商两融利率集体下滑|世界新资讯
焦点速看:连通三大火车站,广州站至广州南站将建铁路联络线
莫言称余华根本不是我的对手:神评当代大学生脱不下孔乙己长衫 让人感慨
或卖17万!特斯拉公布全新车型 新一代平台打造:不用任何稀土
华为启动建设“双万兆之城”:5.5G峰值速率10Gbps 比5G快9倍-每日观点
北京发布人工智能算法领域专门人才政策
环球通讯!【读财报】创业板一季度业绩透视:近四成公司营收净利双增 机械设备、医药生物等行业表现突出
苹果联合创始人称想死就买特斯拉!马斯克回应:这比人类驾驶安全10倍
全球快报:仙侠剧《护心》惊现科技梗:"爱凤"变“花为” 剧情脑洞大开
2023特斯拉股东大会正式召开!一文了解重点内容
天天热讯:迪马尔科赛后话筒喊话:谁不跳谁就是米兰球迷 一起去伊斯坦布尔
关于Kubernetes-k8s集群在任意nodes节点上执行kubectl和kubadm命令的方法 全球报资讯
至少30元/杯!国人消费越来越冷静:都不喝星巴克了...
最高读取7100MB/s!京东京造鲲鹏SSD发布:2TB 579元
成都医保局缴费记录多久更新?-今日热搜
03-运算符
播报:不如华为轻薄!曝三星Galaxy Z Fold5 7月发
世界关注:无力自研 大众密谋动用数十亿欧元收购华为车BU:玩真的?
全球微头条丨好评如潮PC大作!黑客修复《生化危机4重制版》破解补丁:更加完美了
《英雄联盟》2023MSI:BLG3:1战胜G2 晋级四强|全球播资讯
淄博快递员称发不完根本发不完:我在淄博40年 没见过这么火热过-全球今亮点
吃粽子表示着什么 吃粽子预示着什么
全球简讯:谈谈AI产品经理的产品开发流程
勒沃库森官方:球队传奇贝拉拉比将在本赛季结束后离队_时快讯
Python学习之十三_pip的学习
中科院专家谈ChatGPT:被过度炒作和神化 不久就是白菜价-天天微速讯
电脑16GB内存到底够不够用?实测揭晓答案_环球快讯
全球速读:RTX4070游戏本杀疯!晚买果真享折扣 等等党赢了
浙江多地海边现“蓝眼泪”奇观:场面惊艳
某某吉他谱_某某吉他谱
关于k8s-master节点的token过期后的处理方法-让新node节点加入的方法-每日热点
每日聚焦:下半年的神U!联发科天玑9200+稳了:性能霸榜安卓阵营
rpcauthnlevelprivacy enabled_privacyiconclient exe 每日资讯
聊聊我认为的OpenFeign|微动态
IDEA配合Docker插件进行一键部署
文心一言 VS chatgpt (17)-- 算法导论4.1 3~4题 全球速读
洛谷颜色对照表 焦点短讯
版本升级!微软更新Windows 11 22H2正式版官方ISO镜像:免费下载
世界热头条丨更近了!中国新一代载人火箭进展顺利:一级可复用
焦点短讯!520用得着!杰士邦进口零感组合0.8元/只速囤:超薄澎湃
女网红用AI和1000个男友同时谈恋爱:轻松月入3000万
神似iPhone!realme narzo N53来了:后置双摄 主打轻薄-世界速看
超合金战记3boss大全(超合金战记3怎么抽斯巴达)
当前资讯!探索数字未来——虚拟数字化展厅的革新之旅
Java设计模式-装饰模式
法治服务“零距离”,让法治意识深入人心
你支持吗?广州研究压缩机动车道宽度 让电动自行车通行|每日焦点
能量密度断层式领先!宁德时代:凝聚态电池正用于电动载人飞机开发|全球独家
天天热资讯!《甄嬛传》胧月公主扮演者回应近照曝光:没买热搜
每日看点!299元起!闪极《流浪地球2》联名移动电源开售 比手办还精致