opencv 直方图处理(python)

本文详细介绍了图像直方图的概念及其在图像处理中的作用,包括如何使用Numpy和OpenCV绘制直方图,以及如何使用掩模进行特定区域的直方图分析。此外,还探讨了直方图均衡化的基本原理和在图像增强中的应用,展示了如何使用OpenCV的`cv2.equalizeHist()`函数进行直方图均衡化处理,以提高图像的对比度和视觉效果。

直方图处理

直方图从图像内部灰度级的角度对图像进行表述

从直方图的角度对图像进行处理,可以达到增强图像显示效果的目的。

直方图的含义

直方图是图像内灰度值的统计特性与图像灰度值之间的函数,直方图统计图像内各个灰度级出现的次数。

从直方图的图形上观察,横坐标是图像中各像素点的灰度级,纵坐标是具有该灰度级(像素值)的像素个数。

在绘制直方图时,将灰度级作为x轴处理,该灰度级出现的次数作为y轴处理

把左侧的直线图和右侧直方图都称为直方图

image-20220515220454617

在实际处理中,图像直方图的x轴区间一般是[0, 255],对应的是8位位图的256个灰度级;y轴对应的是具有相应灰度级的像素点的个数。

归一化直方图: 在归一化直方图中,x轴仍然表示灰度级;y轴不再表示灰度级出现的次数,而是灰度级出现的频率。

灰度级出现的频率=灰度级出现的次数/总像素数

在归一化直方图中,各个灰度级出现的频率之和为1。

归一化直方图与直方图在外观上是一致的,只是y轴的标签不同而已。

在OpenCV的官网上,特别提出了要注意的三个概念:DIMS、BINS、RANGE

  • DIMS:表示在绘制直方图时,收集的参数的数量。一般情况下,直方图中收集的数据只有一种,就是灰度级。因此,该值为1。

  • RANGE:表示要统计的灰度级范围,一般为[0, 255]。0对应的是黑色,255对应的是白色。

  • BINS:参数子集的数目。在处理数据的过程中,有时需要将众多的数据划分为若干个组,再进行分析。

    例如: 希望将两个像素值作为一组讨论

绘制直方图

Python的模块matplotlib.pyplot中的hist()函数能够方便地绘制直方图,通常采用该函数直接绘制直方图。

除此以外,OpenCV中的cv2.calcHist()函数能够计算统计直方图,还可以在此基础上绘制图像的直方图。

使用Numpy绘制直方图

模块matplotlib.pyplot提供了一个类似于MATLAB绘图方式的框架,可以使用其中的matplotlib.pyplot.hist()函数来绘制直方图。

此函数的作用是根据数据源和灰度级分组绘制直方图。

其基本语法格式为:

matplotlib.pyplot.hist(X, BINS)
  • X:数据源,必须是一维的。图像通常是二维的,需要使用ravel()函数将图像处理为一维数据源以后,再作为参数使用。
  • BINS:BINS的具体值,表示灰度级的分组情况。

函数ravel()的作用是将二维数组降维成一维数组。

例如:数组a

image-20220515221041954

使用函数ravel()对a进行处理:

b = a.ravel() 

image-20220515221114556

使用hist()函数绘制一幅图像的直方图

import cv2 
import matplotlib.pyplot as plt 
o=cv2.imread("./img/hand1.png") 
cv2.imshow("original", o) 
plt.hist(o.ravel(),256)
plt.show()
cv2.waitKey() 
cv2.destroyAllWindows() 

使用函数hist()将一幅图像的灰度级划分为16组后,绘制该图像的直方图。

将灰度级划分为16组,即将灰度级划分为16个子集,对应的BINS值为16。

import cv2 
import matplotlib.pyplot as plt 
o=cv2.imread("./img/hand1.png") 
plt.hist(o.ravel(),16) 
plt.show()
使用OpenCV绘制直方图

OpenCV提供了函数cv2.calcHist()用来计算图像的统计直方图,该函数能统计各个灰度级的像素点个数。

利用matplotlib.pyplot模块中的plot()函数,可以将函数cv2.calcHist()的统计结果绘制成直方图。

  1. 用cv2.calcHist()函数统计图像直方图信息

    函数cv2.calcHist()用于统计图像直方图信息,其语法格式为:

    hist = cv2.calcHist( images, channels, mask, histSize, ranges, accumulate )
    

    函数中返回值及参数的含义为:

    • hist:返回的统计直方图,是一个一维数组,数组内的元素是各个灰度级的像素个数。

    • images:原始图像,该图像需要使用“[ ]”括起来。

    • channels:指定通道编号。通道编号需要用“[ ]”括起来,如果输入图像是单通道灰度图像,该参数的值就是[0]。对于彩色图像,它的值可以是[0]、[1]、[2],分别对应通道B、G、R。

    • mask:掩模图像。当统计整幅图像的直方图时,将这个值设为None。当统计图像某一部分的直方图时,需要用到掩模图像。

      仅计算掩膜区域

    • histSize:BINS的值,该值需要用“[ ]”括起来。例如,BINS的值是256,需要使用“[256]”作为此参数值。

    • ranges:即像素值范围。例如,8位灰度图像的像素值范围是[0, 255]。

    • accumulate:累计(累积、叠加)标识,默认值为False。如果被设置为True,则直方图在开始计算时不会被清零,计算的是多个直方图的累积结果,用于对一组图像计算直方图。该参数允许从多个对象中计算单个直方图,或者实时更新直方图。该参数是可选的,一般情况下不需要设置。

    **例子:**使用cv2.calcHist()函数计算一幅图像的统计直方图结果,并观察得到的统计直方图信息。

    import cv2 
    import numpy as np 
    img=cv2.imread("./img/hand1.png") 
    hist = cv2.calcHist([img], [0], None, [256], [0,255]) 
    print(type(hist)) 
    print(hist.shape
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴风雨中的白杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值