用Python如何实现多种样式的直方图统计效果
Admin 2022-06-09 群英技术资讯 413 次浏览
直方图就是对图像的另外一种解释,它描述了整幅图像的灰度分布。直方图的 x 轴代表灰度值(0~255),y 轴代表图片中同一种灰度值的像素点的数目,所以通过直方图我们可以对图像的亮度、灰度分布、对比度等有了一个直观的认识
BINS
前面说到,直方图中的 x 轴表示的是灰度值,一幅灰度图的灰度等级有 256 级,所以我们是否需要将每一个等级标注在一条轴上呢?或者如果我们需要的不是每一个灰度值的分布,而是一个范围内的灰度分布呢?所以我们将每一个需要的灰度值范围称为一个 BIN,即所有的灰度等级被分为几个小组,每一个小组是一个 BIN
DIMS
代表的是我们收集的图像的参数的数目,直方图我们如果只收集灰度值一个参数,那么该参数的值就是1
RANGE
代表统计的灰度值的范围,一般的范围是[0-255]
在计算机视觉系列的文章中第一件事就是读取图像信息:
""" 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
绘制直方图使用的函数如下:
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()
上图就是对蓝色通道绘制的直方图
如果我们不需要整幅图像中的直方图,而是某个区域的直方图,我们只需要绘制一幅图,将需要统计的部分设置为白色,不需要统计的部分设置为黑色,就构成了一幅掩膜图像
得到掩模图
##得到掩膜图 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()
得到的图像如下:
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)
此处参考: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),至于为什么峰值较少,个人猜测是由于原图中的色彩变化不明显,导致没办法绘制出过多过明显的峰值
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
Selenium 是一个 Web的自动化测试工具 ,最初是为网站 自动化测试而开发的 , Selenium 可以直接调用浏览器 ,它支持所有主流的浏览器,本文给大家介绍Python 如何安装Selenium,感兴趣的朋友一起看看吧
这篇文章介绍了 Python 列表和字典常踩坑即解决方案,主要针对python列表和字典得一些问题,提出了多种解决方案。需要的小伙伴可以参考一下
命名空间是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的。命名空间提供了在项目中避免名字冲突的一种方法。各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。
在Python 中,and 和 or 执行布尔逻辑演算,如你所期待的一样,但是它们并不返回布尔值;而是,返回它们实际进行比较的值之一。一、and
api接口在我们开发中的重要性相信大家都这篇文章主要给大家介绍了关于利用python写api接口实战的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008