机器学习进阶-直方图与傅里叶变化-直方图均衡化 1.cv2.equalizeHist(进行直方图均衡化) 2. cv2.createCLAHA(用于生成自适应均衡化图像)
Posted my-love-is-python
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习进阶-直方图与傅里叶变化-直方图均衡化 1.cv2.equalizeHist(进行直方图均衡化) 2. cv2.createCLAHA(用于生成自适应均衡化图像)相关的知识,希望对你有一定的参考价值。
1. cv2.equalizeHist(img) # 表示进行直方图均衡化
参数说明:img表示输入的图片
2.cv2.createCLAHA(clipLimit=8.0, titleGridSize=(8, 8)) 用于生成自适应均衡化图像
参数说明:clipLimit颜色对比度的阈值, titleGridSize进行像素均衡化的网格大小,即在多少网格下进行直方图的均衡化操作
直方图均衡化:一般可以用来提升图片的亮度, 在上面一节中,我们可以看出在150-200之间所占的频数特别的大,频数均衡化指的是让频数的分布看起来更加均匀一些
主要实现的手段
上图中的左边的图是原始数据, 右边的图是进行函数映射后的灰度值
首先对各个灰度值做频数统计,计算其概率,根据像素的灰度值计算出累积概率,最后将累积概率 * (255-0) 做为函数映射后的灰度值,
这样做的目的,可以使得灰度值之间的间隔更小,即一些频数较大的灰度值补充给了频数较小的灰度值,从而实现了灰度值的均衡化
代码:
第一步:读入图片
第二步:使用cv2.equalizeHist(img)均衡化像素
第三步:使用plt.hist 画出均衡化的直方图
第四步:使用plt.imshow 画出均衡化后的图像
import cv2 import numpy as np import matplotlib.pyplot as plt # 第一步:读入图片 img = cv2.imread(‘cat.jpg‘, 0) # 第二步: 使用cv2.equalizeHist实现像素点的均衡化 ret = cv2.equalizeHist(img) # 第三步:使用plt.hist绘制像素直方图 plt.subplot(121) plt.hist(img.ravel(), 256) plt.subplot(122) plt.hist(ret.ravel(), 256) plt.show() # 第四步:使用cv2.imshow()绘值均衡化的图像 cv2.imshow(‘ret‘, np.hstack((img, ret))) cv2.waitKey(0)
这种全局的均衡化也会存在一些问题,由于整体亮度的提升,也会使得局部图像的细节变得模糊,因为我们需要进行分块的局部均衡化操作
代码:
第一步:使用cv2.createCLAHE(clipLimit=2.0, titleGridSize=(8, 8)) 实例化均衡直方图函数
第二步:使用.apply进行均衡化操作
第三步:进行画图操作
# 使用自适应直方图均衡化 # 第一步:实例化自适应直方图均衡化函数 clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) # 第二步:进行自适应直方图均衡化 clahe = clahe.apply(img) # 第三步:进行图像的展示 cv2.imshow(‘imgs‘, np.hstack((img, ret, clahe))) cv2.waitKey(0) cv2.destroyAllWindows()
可以看出自适应均衡化没有使得人物脸部的细节消失
以上是关于机器学习进阶-直方图与傅里叶变化-直方图均衡化 1.cv2.equalizeHist(进行直方图均衡化) 2. cv2.createCLAHA(用于生成自适应均衡化图像)的主要内容,如果未能解决你的问题,请参考以下文章
3. OpenCV-Python——图像梯度算法边缘检测图像金字塔与轮廓检测直方图与傅里叶变换
opencv-python图像处理 ---直方图与傅里叶变换逆变换