首页IT科技python直方图绘制代码(Python从零到壹丨图像增强及运算:图像掩膜直方图和HS直方图)

python直方图绘制代码(Python从零到壹丨图像增强及运算:图像掩膜直方图和HS直方图)

时间2025-07-07 10:52:59分类IT科技浏览4567
导读:摘要:本章主要讲解图像直方图相关知识点,包括掩膜直方图和HS直方图,并通过直方图判断黑夜与白天,通过案例分享直方图的实际应用。...

摘要:本章主要讲解图像直方图相关知识点            ,包括掩膜直方图和HS直方图                     ,并通过直方图判断黑夜与白天       ,通过案例分享直方图的实际应用            。

本文分享自华为云社区《[Python从零到壹] 五十二.图像增强及运算篇之图像掩膜直方图和HS直方图》         ,作者: eastmount                     。

一.图像掩膜直方图

如果要统计图像的某一部分直方图                    ,就需要使用掩码(蒙板)来进行计算       。假设将要统计的部分设置为白色           ,其余部分设置为黑色      ,然后使用该掩膜进行直方图绘制                   ,其完整代码如下所示         。

其运行结果如图1所示               ,它使用了一个200×200像素的掩膜进行实验                    。其中图1(a)表示原始图像   ,图1(b)表示200×200像素的掩膜                  ,图1©表示原始图像进行掩膜处理                  ,图1(d)表示直方图曲线,蓝色曲线为原始图像的灰度值直方图分布情况               ,绿色波动更小的曲线为掩膜直方图曲线           。

二.图像HS直方图

为了刻画图像中颜色的直观特性                     ,常常需要分析图像的HSV空间下的直方图特性      。HSV空间是由色调(Hue)            、饱和度(Saturation)                     、以及亮度(Value)构成   ,因此在进行直方图计算时            ,需要先将源RGB图像转化为HSV颜色空间图像                     ,然后将对应的H和S通道进行单元划分       ,再其二维空间上计算相对应直方图         ,再计算直方图空间上的最大值并归一化绘制相应的直方图信息                    ,从而形成色调-饱和度直方图(或H-S直方图)                   。该直方图通常应用在目标检测       、特征分析以及目标特征跟踪等场景[1-2]               。

由于H和S分量与人感受颜色的方式是紧密相连           ,V分量与图像的彩色信息无关      ,这些特点使得HSV模型非常适合于借助人的视觉系统来感知彩色特性的图像处理算法   。

下面的代码是具体的实现代码                   ,使用matplotlib.pyplot库中的imshow()函数来绘制具有不同颜色映射的2D直方图                  。

# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt #读取图像 img = cv2.imread(luo.png) #转换为RGB图像 img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #图像HSV转换 hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) #计算H-S直方图 hist = cv2.calcHist(hsv, [0,1], None, [180,256], [0,180,0,256]) #原始图像 plt.figure(figsize=(8, 6)) plt.subplot(121), plt.imshow(img_rgb, gray), plt.title("(a)"), plt.axis(off) #绘制H-S直方图 plt.subplot(122), plt.imshow(hist, interpolation=nearest), plt.title("(b)") plt.xlabel("x"), plt.ylabel("y") plt.show()

图2(a)表示原始输入图像               ,图2(b)是原图像对应的彩色直方图   ,其中X轴表示饱和度(S)                  ,Y轴表示色调(H)                  。在直方图中                  ,可以看到H=140和S=130附近的一些高值,它对应于艳丽的色调。

三.直方图判断白天黑夜

接着讲述一个应用直方图的案例               ,通过直方图来判断一幅图像是黑夜或白天               。常见的方法是通过计算图像的灰度平均值         、灰度中值或灰度标准差                     ,再与自定义的阈值进行对比   ,从而判断是黑夜还是白天[3-4]                     。

灰度平均值:该值等于图像中所有像素灰度值之和除以图像的像素个数   。 灰度中值:对图像中所有像素灰度值进行排序            ,然后获取所有像素最中间的值                     ,即为灰度中值            。 灰度标准差:又常称均方差       ,是离均差平方的算术平均数的平方根                     。标准差能反映一个数据集的离散程度         ,是总体各单位标准值与其平均数离差平方的算术平均数的平方根       。如果一幅图看起来灰蒙蒙的                    , 那灰度标准差就小;如果一幅图看起来很鲜艳           ,那对比度就很大      ,标准差也大         。

下面的代码是计算灰度“Lena               ”图的灰度平均值                    、灰度中值和灰度标准差                    。

# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt #函数: 获取图像的灰度平均值 def fun_mean(img, height, width): sum_img = 0 for i in range(height): for j in range(width): sum_img = sum_img + int(img[i,j]) mean = sum_img / (height * width) return mean #函数: 获取中位数 def fun_median(data): length = len(data) data.sort() if (length % 2)== 1: z = length // 2 y = data[z] else: y = (int(data[length//2]) + int(data[length//2-1])) / 2 return y #读取图像 img = cv2.imread(lena-hd.png) #图像灰度转换 grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #获取图像高度和宽度 height = grayImage.shape[0] width = grayImage.shape[1] #计算图像的灰度平均值 mean = fun_mean(grayImage, height, width) print("灰度平均值:", mean) #计算图像的灰度中位数 value = grayImage.ravel() #获取所有像素值 median = fun_median(value) print("灰度中值:", median) #计算图像的灰度标准差 std = np.std(value, ddof = 1) print("灰度标准差", std)

其运行结果如图3所示                   ,图3(a)为原始图像               ,图3(b)为处理结果           。其灰度平均值为123   ,灰度中值为129                  ,灰度标准差为48.39      。

下面讲解另一种用来判断图像是白天还是黑夜的方法                  ,其基本步骤如下:

(1)读取原始图像,转换为灰度图               ,并获取图像的所有像素值; (2)设置灰度阈值并计算该阈值以下的像素个数                   。比如像素的阈值设置为50                     ,统计低于50的像素值个数; (3)设置比例参数   ,对比该参数与低于该阈值的像素占比            ,如果低于参数则预测为白天                     ,高于参数则预测为黑夜               。比如该参数设置为0.8       ,像素的灰度值低于阈值50的个数占整幅图像所有像素个数的90%         ,则认为该图像偏暗                    ,故预测为黑夜;否则预测为白天   。

具体实现的代码如下所示                  。

# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt #函数: 判断黑夜或白天 def func_judge(img): #获取图像高度和宽度 height = grayImage.shape[0] width = grayImage.shape[1] piexs_sum = height * width dark_sum = 0 #偏暗像素个数 dark_prop = 0 #偏暗像素所占比例 for i in range(height): for j in range(width): if img[i, j] < 50: #阈值为50 dark_sum += 1 #计算比例 print(dark_sum) print(piexs_sum) dark_prop = dark_sum * 1.0 / piexs_sum if dark_prop >=0.8: print("This picture is dark!", dark_prop) else: print("This picture is bright!", dark_prop) #读取图像 img = cv2.imread(day.png) #转换为RGB图像 img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #图像灰度转换 grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #计算256灰度级的图像直方图 hist = cv2.calcHist([grayImage], [0], None, [256], [0,255]) #判断黑夜或白天 func_judge(grayImage) #显示原始图像和绘制的直方图 plt.subplot(121), plt.imshow(img_rgb, gray), plt.axis(off), plt.title("(a)") plt.subplot(122), plt.plot(hist, color=r), plt.xlabel("x"), plt.ylabel("y"), plt.title("(b)") plt.show()

第一张测试图输出的结果如图4所示           ,其中图4(a)为原始图像      ,图4(b)为对应直方图曲线                  。

最终输出结果为“(‘This picture is bright!’, 0.010082704388303882)                   ”                   ,该预测为白天。

第二张测试图输出的结果如图6所示               ,其中图6(a)为原始图像   ,图6(b)为对应直方图曲线               。

最终输出结果为“(‘This picture is dark!’, 0.8511824175824175)      ”                  ,该预测为黑夜                     。

四.总结

本章主要讲解图像直方图相关知识点                  ,包括掩膜直方图和HS直方图,并通过直方图判断黑夜与白天               ,通过案例分享直方图的实际应用   。希望对您有所帮助                     ,后续将进入图像增强相关知识点            。

参考文献:

[1]冈萨雷斯. 数字图像处理(第3版)[M]. 北京:电子工业出版社, 2013. [2]张恒博, 欧宗瑛. 一种基于色彩和灰度直方图的图像检索方法[J]. 计算机工程, 2004. [3]Eastmount. [数字图像处理] 四.MFC对话框绘制灰度直方图[EB/OL]. (2015-05-31). https://blog.csdn.net/eastmount/article/details/46237463. [4]ZJE_ANDY. python3+opencv 利用灰度直方图来判断图片的亮暗情况[EB/OL]. (2018-06-20). https://blog.csdn.net/u014453898/article/details/80745987. [5]阮秋琦. 数字图像处理学(第3版)[M]. 北京:电子工业出版社, 2008. [6]Eastmount. [Python图像处理] 十一.灰度直方图概念及OpenCV绘制直方图[EB/OL]. (2018-11-06). https://blog.csdn.net/Eastmount/article/details/83758402.

点击关注   ,第一时间了解华为云新鲜技术~

声明:本站所有文章            ,如无特殊说明或标注                     ,均为本站原创发布                     。任何个人或组织       ,在未征得本站同意时         ,禁止复制           、盗用      、采集                   、发布本站内容到任何网站               、书籍等各类媒体平台       。如若本站内容侵犯了原著者的合法权益                    ,可联系我们进行处理         。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
搜索引擎优化与SEM网络营销的实用技巧(掌握搜索引擎规则,让营销更——以seo和sem为例) explorer.exe老是无响应(explorer.exe无响应桌面卡死怎么办?explorer频繁卡死无响应的三种解决方法)