Python+OpenCV图像处理之直方图统计的示例分析
导读:本文共3769.5字符,通常情况下阅读需要13分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 1. 直方图概述(1)基本概念直方图就是对图像的另外一种解释,它描述了整幅图像的灰度分布。直方图的 x 轴代表灰度值(0~255),y 轴代表图片中同一种灰度值的像素点的数目,所以通过直方图我们可以对图像的亮度、灰度分布、对比度等有了一个直观的认识(2)直方图中的术语BINS前面说到,直方图中的 x 轴表示的是灰度值,一幅灰度图的灰度等级有 256 级,所以我们... ...
目录
(为您整理了一些要点),点击可以直达。1. 直方图概述
(1)基本概念
直方图就是对图像的另外一种解释,它描述了整幅图像的灰度分布。直方图的 x 轴代表灰度值(0~255),y 轴代表图片中同一种灰度值的像素点的数目,所以通过直方图我们可以对图像的亮度、灰度分布、对比度等有了一个直观的认识
(2)直方图中的术语
BINS
前面说到,直方图中的 x 轴表示的是灰度值,一幅灰度图的灰度等级有 256 级,所以我们是否需要将每一个等级标注在一条轴上呢?或者如果我们需要的不是每一个灰度值的分布,而是一个范围内的灰度分布呢?所以我们将每一个需要的灰度值范围称为一个 BIN,即所有的灰度等级被分为几个小组,每一个小组是一个 BIN
DIMS
代表的是我们收集的图像的参数的数目,直方图我们如果只收集灰度值一个参数,那么该参数的值就是1
RANGE
代表统计的灰度值的范围,一般的范围是[0-255]
2. 直方图绘制
(1)读取图像信息
在计算机视觉系列的文章中第一件事就是读取图像信息:
"""Author:XiaoMadate:2021/10/24"""#调用需要的包importcv2importmatplotlib.pyplotaspltimg0=cv2.imread('E:\FromZhihu\Forthedesk\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:\FromZhihu\Forthedesk\cvseven1.jpeg')plt.show()
可以看出这幅灰度图中亮度较高的像素点还是占多数的,即整体亮度较高
彩色图直方图
读入彩色图像,并对某一个通道进行直方图绘制
"""Author:XiaoMadate:2021/10/24"""#调用需要的包importcv2importmatplotlib.pyplotaspltplt.rcParams['font.family']='SimHei'#将全局中文字体改为黑体img0=cv2.imread('E:\FromZhihu\Forthedesk\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:\FromZhihu\Forthedesk\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:\FromZhihu\Forthedesk\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:\FromZhihu\Forthedesk\cvseven3.jpeg')plt.show()
得到的图像如下:
上图中的 X 轴代表S(饱和度),Y轴代表H(色调)
该图中的峰值主要分布在 S 在(0-50)之间 H在(20-80),至于为什么峰值较少,个人猜测是由于原图中的色彩变化不明显,导致没办法绘制出过多过明显的峰值
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
Python+OpenCV图像处理之直方图统计的示例分析的详细内容,希望对您有所帮助,信息来源于网络。