目录
2.4.3 自适应直方图均衡化 createCLAHE()与apple()
1 原理
我们统计图像中的每个像素点的值,然后把每个值绘制成直方图
- images 被统计的图像
- channels 被统计的图像通道,可以只为B,G,R其中一个通道
- mask 掩膜的意思是提取图像的一部分
- histSize 直方图横坐标的取值范围,全部是0-255,也就是[256],我可以把横坐标改小,比如[200]
- ranges 像素取值范围,一般为[0:256],也可以改小,比如[0:200]
一般来讲最后的两个参数是不变的
2 代码实现 calcHist()
下面我们看一下该怎么用
2.1 绘制灰度图像的直方图
导入库后,读取灰度图像,使用hist,然后我们看一下shape
- 此处要注意calcHist的参数需要在参数外加一层中括号,不然会报错
这个shape表示我x方向有256个可以取的值(0-255),纵向有一个可以取的值,像素点对应的个数
然后我们使用plt给直方图画出来
- 注意一点,plt默认通道为R,G,B,cv2默认通道为B,G,R
2.2 绘制彩色图像的直方图
上面这个图是灰度的,我们再将其变成彩色的,我们把b,g,r三个通道放到一张图中
2.3 掩膜操作
上面的两张图我们都没有使用掩膜,下面我们先创建一个掩膜
2.3.1 创建掩膜
首先我们获取图片的大小,然后创建一个图像大小的全0矩阵,然后我们将x方向100-300,y方向100-400矩阵中的值设置为255
- np.uint8是无符号8位整形
掩膜就是两部分组成的,黑色部分与白色部分
2.3.2 图像结合掩膜 bitwise_and()
这里是进行的与操作,可以保留白色区域的图像
bitwise_and前两个参数的情况是这样的,我们是下图的情况一,代表两个图像数组且大小相同,最终的值就为img
上图转自 https://blog.csdn.net/LaoYuanPython/article/details/109148867
2.3.3 绘制掩膜后的直方图与非掩膜的直方图
红色的是掩膜后的,蓝色是非掩膜的
2.4 直方图均衡化
2.4.1 原理
我们现在获取左侧狗的直方图,发现像素多在中间几个像素上
我们现在像增大两侧的像素点的个数,使直方图更加均衡
下面我们举个例子
- 左侧是不均衡的图像,右侧是我们均衡后的图像
- 首先统计像素值有哪写,左侧的图中一共四种像素值50,128,200,255
- 之后统计每个像素的个数
- 之后统计概率0.25 = 4/(4+3+5+4),0.1875=3/(4+3+5+4)这样算
- 累计概率是该值之前的所有概率加和,50前面没有其他值累计概率等于概率,128的概率0.4375 = 0.25 + 0.1875
- 根据函数映射后的灰度值,这个是使用累计概率*取值范围,比如50这一行为0.25 * (255-0) = 63.75,再比如128这一行为0.4375 * (255-0) = 111.5625
- 取整
- 原来灰度值为50的,现在变为64
- 128的现在为112
- 原来为200的,现在为191
- 255变为255
2.4.2 代码实现 equalizeHist()
我们使用之前猫的图片,那个就不是很均衡,整体偏亮
- 均衡前
- 均衡后
我们现在把均衡后图片搞过来看一下
2.4.3 自适应直方图均衡化 createCLAHE()与apply()
这个方法是指,把一张大图分为若干块,对每块进行均衡化,然后合并到一起
我们把直接均衡化和自适应均衡化放在一起,左边是非自适应,右边是自适应
- createCLANE是将图像分块,之后处理边缘像素,然后均衡像素点,这个就涉及到另一个算法了之后有机会会讲,clipLimit是对比度限制的阈值,tileGridSize是直方图均衡化的网格大小,我们现在是每8*8像素一块
- apply是将createCLAHE应用到img上