文章目录

  • 前言
  • 原理
  • 步骤
  • 优缺点
  • 改进
    • 自适应均衡化(AHE)
    • 限制对比度的自适应直方图均衡化(CLAHE)
  • 实现

前言

利用直方图将图像对比度进行调整,可用来增强局部对比度而对其他部分对比度不受影响。这种方法对于背景和前景都太亮或者太暗的图像非常有用。
直方图:
根据各个灰度级的出现次数绘制成条形图。 如下实例:

原理

假设r( r ≥ 0 r\geq0 r≥0)和s( s ≤ 1 s\leq1 s≤1)分别表示归一化的原图像灰度和通过直方图均衡化后的图像灰度,对于每一个r,灰度变换函数 T ( r ) T(r) T(r)都可以产生一个对应的s,即: s = T ( r ) s=T(r) s=T(r),其满足以下两个条件:

  1. 在 0 ≤ r ≤ 1 0\leq r\leq 1 0≤r≤1内, T ( r ) T(r) T(r)为单调递增函数;
  2. 在 0 ≤ r ≤ 1 0\leq r\leq 1 0≤r≤1内,有 0 ≤ T ( r ) ≤ 1 0\leq T(r)\leq1 0≤T(r)≤1。

s所对应的分布函数为:
F s ( s ) = ∫ − ∞ s P s ( s ) d s = ∫ − ∞ r P r ( r ) d r F_{s}(s)=\int_{-\infty}^{s}{P_{s}(s)}ds=\int_{-\infty}^{r}{P_{r}(r)}dr Fs​(s)=∫−∞s​Ps​(s)ds=∫−∞r​Pr​(r)dr
其中, P s ( s ) {P_{s}(s)} Ps​(s)为均衡化之后图像灰度的概率密度函数, P r ( r ) P_{r}(r) Pr​(r)为原图像灰度的概率密度函数。
对上式两边求导可得:
P s ( s ) = d F s ( s ) d s = P r ( r ) d r d s = P r ( r ) d r d [ T ( r ) ] P_{s}(s)=\frac{dF_{s}(s)}{ds}=P_{r}(r)\frac{dr}{ds}=P_{r}(r)\frac{dr}{d[T(r)]} Ps​(s)=dsdFs​(s)​=Pr​(r)dsdr​=Pr​(r)d[T(r)]dr​
由此可以看出通过灰度变换函数 T ( r ) T(r) T(r)可以控制灰度概率密度函数 P s ( s ) P_{s}(s) Ps​(s),从而改善图像的灰度层次。
灰度变换函数的确定:
直方图均衡化的最终目的是获得灰度均匀分布的图像,因此均衡化之后的直方图的 P s ( s ) P_{s}(s) Ps​(s)应当是均匀分布的概率密度函数,即 P s ( s ) = 1 P_{s}(s)=1 Ps​(s)=1。对上式积分可得:
s = T ( r ) = ∫ 0 r P r ( r ) d r s=T(r)=\int_{0}^{r}P_{r}(r)dr s=T(r)=∫0r​Pr​(r)dr
灰度级为离散的数字图像时,其灰度变换函数为:
s k = T ( r k ) = ∑ i = 0 k p r ( r i ) = ∑ i = 0 k n i N s_{k}=T(r_{k})=\sum_{i=0}^{k}{p_{r}(r_{i})}=\sum_{i=0}^{k}{\frac{n_{i}}{N}} sk​=T(rk​)=i=0∑k​pr​(ri​)=i=0∑k​Nni​​
其中, 0 ≤ r k ≤ 1 ( k = 0 , 1 , 2 , ⋯ , L − 1 ) 0\leq r_{k}\leq1(k=0,1,2,\cdots,L-1) 0≤rk​≤1(k=0,1,2,⋯,L−1), r k = k / ( L − 1 ) r_{k}=k/(L-1) rk​=k/(L−1),L-1表示没有归一化的原图像的灰度最大值; n i n_{i} ni​为原图像中第 i i i个灰度级的像素出现的次数;N为原图像中像素点的总数。
对于灰度分布在[0,L-1]的灰度图像,只需将上式乘以灰度的最大值L-1即可:
s k = T ( r k ) = ∑ i = 0 k p r ( r i ) × ( L − 1 ) = ∑ i = 0 k n i N × ( L − 1 ) s_{k}=T(r_{k})=\sum_{i=0}^{k}{p_{r}(r_{i})}\times(L-1)=\sum_{i=0}^{k}{\frac{n_{i}}{N}}\times(L-1) sk​=T(rk​)=i=0∑k​pr​(ri​)×(L−1)=i=0∑k​Nni​​×(L−1)

步骤

第一步:统计每个灰度级的像素个数并绘制直方图;
第二步:计算新的灰度级;
第三步:修正 s k s_{k} sk​为合理的灰度级;
第四步:计算新的直方图;
第五步:用处理后的新灰度代替处理前的灰度,生成新图像。

优缺点

优点: 直观可视化换技术;可进行逆操作,如果已知均衡化函数,便可以恢复原始的直方图。
缺点: 没有考虑局部图像区域,只是将整体均衡化,所以会由于整体亮度的提升使得局部图像的细节变得模糊。
对彩色图像均衡化采用三通道分别进行均衡化然后再合成的方法。还有一种方法是先把RGB转换为HSV,然后再均衡化。

改进

自适应均衡化(AHE)

对于在直方图均衡化的缺点衍生出了自适应均衡化的方法,其主要思想是在均衡化过程中将图像分为若干子块,对每个子块进行直方图均衡化处理,只利用局部区域窗口内的直方图分布构建映射函数,因此更适合改进图像局部对比度以获得更多的图像细节。
优点: 图像的灰度值较好地分布在了全部动态范围上,局部对比度得到了提升,视觉效果优于直方图均衡化。
缺点: 局部对比度提高过大会导致图像失真,还会放大图像中的噪声。

限制对比度的自适应直方图均衡化(CLAHE)

对于自适应直方图均衡化产生的对比度过大和不连续等缺点,衍生出该方法,其改进在于:
限制直方图分布:
对于原图像的直方图设定一个阈值,对超过阈值的灰度级进行裁剪,然后将超出阈值的部分平均分配到各个灰度级,将使得映射函数的结果较为平缓。其步骤如下:
第一步:对图像进行分块;
第二步:计算每个子块的直方图;
第三步:计算裁剪阈值;
第四步:对裁剪之后多余的像素点进行重新分配;
第五步:直方图均衡;
第六步:像素点灰度值重构。
插值:
将图像进行分块处理后会导致最终图像呈现块状,不连续的情况。所以引入插值方法。

注:图片来源百度搜索
其处理步骤为:
第一步:将图像分成均等大小的等份矩形块,如图中右侧所示;
第二步:计算每个块的直方图,变换函数,这些对于图左侧中的小黑块是符合的,其在分块的中心位置;
第三步:对于边缘的绿色阴影部分采用线性插值求出像素值:
f ( x , y ) = x 2 − x x 2 − x 1 f 1 + x − x 1 x 2 − x 1 f 2 f(x,y)=\frac{x_{2}-x}{x_{2}-x_{1}}f_{1}+\frac{x-x_{1}}{x_{2}-x_{1}}f_{2} f(x,y)=x2​−x1​x2​−x​f1​+x2​−x1​x−x1​​f2​
其中, f ( x , y ) f(x,y) f(x,y)表示所求像素点的值,相邻像素块中心坐标分别为 ( x 1 , y 1 ) (x_{1},y_{1}) (x1​,y1​)和 ( x 2 , y 2 ) (x_{2},y_{2}) (x2​,y2​),相邻块的映射值分别为 f 1 f_{1} f1​和 f 2 f_{2} f2​。
第四步:对于中间的紫色阴影部分采用双线性插值求出像素值:
f ( x , y ) = ( x 2 − x ) ( y 2 − y ) ( x 2 − x 1 ) ( y 2 − y 1 ) f 1 + ( x − x 1 ) ( y 2 − y ) ( x 2 − x 1 ) ( y 2 − y 1 ) f 2 + ( x 2 − x ) ( y − y 1 ) ( x 2 − x 1 ) ( y 2 − y 1 ) f 3 + ( x − x 1 ) ( y − y 1 ) ( x 2 − x 1 ) ( y 2 − y 1 ) f 4 f(x,y)=\frac{(x_{2}-x)(y_{2}-y)}{(x_{2}-x_{1})(y_{2}-y_{1})}f_{1}+\frac{(x-x_{1})(y_{2}-y)}{(x_{2}-x_{1})(y_{2}-y_{1})}f_{2}+\frac{(x_{2}-x)(y-y_{1})}{(x_{2}-x_{1})(y_{2}-y_{1})}f_{3}+\frac{(x-x_{1})(y-y_{1})}{(x_{2}-x_{1})(y_{2}-y_{1})}f_{4} f(x,y)=(x2​−x1​)(y2​−y1​)(x2​−x)(y2​−y)​f1​+(x2​−x1​)(y2​−y1​)(x−x1​)(y2​−y)​f2​+(x2​−x1​)(y2​−y1​)(x2​−x)(y−y1​)​f3​+(x2​−x1​)(y2​−y1​)(x−x1​)(y−y1​)​f4​
其中, f 1 , f 2 , f 3 , f 4 f_{1},f_{2},f_{3},f_{4} f1​,f2​,f3​,f4​为四个像素块的映射值,四个块的中心坐标分别为 ( x 1 , y 1 ) , ( x 1 , y 2 ) , ( x 2 , y 1 ) , ( x 2 , y 2 ) (x_{1},y_{1}),(x_{1},y_{2}),(x_{2},y_{1}),(x_{2},y_{2}) (x1​,y1​),(x1​,y2​),(x2​,y1​),(x2​,y2​)
第五步:对于边角的粉色阴影部分直接进行映射函数计算;
第六步:得到新的直方图,用新灰度代替处理前的灰度,生成新图像。

实现

HE:

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
from skimage.metrics import peak_signal_noise_ratio
from skimage.metrics import structural_similarity
import csvdef equalizeHist(image):B, G, R = cv.split(image)  # 多通道分解为单通道图像# #直方图均衡化EB = cv.equalizeHist(B)EG = cv.equalizeHist(G)ER = cv.equalizeHist(R)equal_test = cv.merge((EB, EG, ER))  # 单通道合成为多通道图像# 计算直方图hist_EB = cv.calcHist([EB], [0], None, [256], [0, 256])hist_EG = cv.calcHist([EG], [0], None, [256], [0, 256])hist_ER = cv.calcHist([ER], [0], None, [256], [0, 256])hist_b = cv.calcHist([B], [0], None, [256], [0, 256])plt.plot(hist_EB, 'b'); #展示均衡化之后B通道的直方图plt.show()plt.plot(hist_b, 'r'); #展示原始B通道直方图plt.show()return equal_test##存储数据
def writeCsv(image, psnr, ssim):row = [image, psnr, ssim]out = open("D:/Histogram equalization/result.csv", "a", newline="")csv_writer = csv.writer(out, dialect="excel")csv_writer.writerow(row)writeCsv("image", "psnr", "ssim")
for j in range(0, 10):test = cv.imread("D:/Histogram equalization/Infrared_image/000{}.jpg".format(str(j)))print(f"000{j}.jpg:")equal_test = equalizeHist(test)#cv.imshow("test", test)#cv.imshow("equal_test", equal_test)cv.imwrite("D:/Histogram equalization/result_image/000{}.jpg".format(str(j)), equal_test)key = cv.waitKey(0)cv.destroyAllWindows()# 计算psnrpsnr = peak_signal_noise_ratio(test, equal_test)# 计算ssimimg_1 = cv.cvtColor(test, cv.COLOR_BGR2GRAY)  # 由于img彩色图片,而img_new是灰度图像,所以计算psnr和ssim之前需要将img转化为灰度图片equal = cv.cvtColor(equal_test, cv.COLOR_BGR2GRAY)ssim = structural_similarity(img_1, equal)print(f"psnr={psnr}")print(f"ssim={ssim}")writeCsv(j, psnr, ssim)

输入图像:

原始图像B通道直方图:

均衡化之后B通道直方图:

原始图像G通道直方图:

均衡化之后G通道直方图:

原始图像R通道直方图:

均衡化之后R通道直方图:

直方图均衡化之后的图像:

对应psnr和ssim:

CLAHE:

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
from skimage.metrics import peak_signal_noise_ratio
from skimage.metrics import structural_similarity
import csvdef hisEqulColor2(img):B, G, R=cv.split(img)clahe=cv.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))b = clahe.apply(B)g = clahe.apply(G)r = clahe.apply(R)hist_B = cv.calcHist([B], [0], None, [256], [0, 256])hist_b = cv.calcHist([b], [0], None, [256], [0, 256])plt.plot(hist_B, 'r')plt.plot(hist_b, 'b')plt.show()hist_G = cv.calcHist([G], [0], None, [256], [0, 256])hist_g = cv.calcHist([g], [0], None, [256], [0, 256])plt.plot(hist_G, 'r')plt.plot(hist_g, 'b')plt.show()hist_R = cv.calcHist([R], [0], None, [256], [0, 256])hist_r = cv.calcHist([r], [0], None, [256], [0, 256])plt.plot(hist_R, 'r')plt.plot(hist_r, 'b')plt.show()image = cv.merge((b, g, r))#cv.cvtColor(ycrcb, cv.COLOR_YCR_CB2BGR, img)return image##存储数据
def writeCsv(image, psnr, ssim):row = [image, psnr, ssim]out = open("D:/Histogram equalization/自适应直方图均衡化/result.csv", "a", newline="")csv_writer = csv.writer(out, dialect="excel")csv_writer.writerow(row)#writeCsv("image", "psnr", "ssim")
for j in range(1, 2):test = cv.imread("D:/Histogram equalization/Infrared_image/000{}.jpg".format(str(j)))print(f"000{j}.jpg:")equal_test = hisEqulColor2(test)cv.imshow("test", test)cv.imshow("equal_test", equal_test)cv.imwrite("D:/Histogram equalization/自适应直方图均衡化/result_image/000{}.jpg".format(str(j)), equal_test)key = cv.waitKey(0)cv.destroyAllWindows()img_1 = cv.cvtColor(test, cv.COLOR_BGR2GRAY)  # 由于img彩色图片,而img_new是灰度图像,所以计算psnr和ssim之前需要将img转化为灰度图片equal = cv.cvtColor(equal_test, cv.COLOR_BGR2GRAY)# 计算psnrpsnr = peak_signal_noise_ratio(img_1, equal)# 计算ssimssim = structural_similarity(img_1, equal)print(f"psnr={psnr}")print(f"ssim={ssim}")writeCsv(j, psnr, ssim)

输入图像同HE。
B通道均衡化前后直方图:

G通道均衡化前后直方图:

R通道均衡化前后直方图:

CLAHE之后的图像:

对应的psnr及ssim如下:

个人学习笔记分享,错误望请指正!

(学习笔记)图像处理——直方图均衡化(HE)相关推荐

  1. python opencv 直方图均衡_详解python OpenCV学习笔记之直方图均衡化

    本文介绍了python OpenCV学习笔记之直方图均衡化,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/d5/daf/tutorial_py_hi ...

  2. PyTorch学习笔记——图像处理(transforms.Normalize 归一化)

    PyTorch学习笔记--图像处理 transforms.Normalize 归一化 回顾 torchvision.ToTensor 归一化 transforms.Normalize 公式 回顾 to ...

  3. OpenCV学习-P29-P32 Opencv直方图均衡化、掩膜

    OpenCV学习-P29-P32 Opencv直方图均衡化及掩膜 1 直方图 2 直方图均衡化 3 直方图自适应均衡化 1 直方图 直方图原理:统计图像各个灰度区间的像素数 cv2.calcHist( ...

  4. 【机器视觉学习笔记】直方图的绘制及直方图均衡化(C++)

    目录 概念 直方图定义 直方图均衡化 为什么要选用累积分布函数 如何运用累积分布函数使得直方图均衡化 C++ 源码 直方图均衡化 绘制直方图 主函数 效果 完整源码 平台:Windows 10 20H ...

  5. [图像处理] 直方图均衡化原理 - 数学推导

    直方图均衡化 效果 代码 import cv2 as cv import numpy as np import matplotlib.pyplot as pltsrc = cv.imread(&quo ...

  6. 图像处理-直方图均衡化

    个人博客:http://www.chenjianqu.com/ 原文链接:http://www.chenjianqu.com/show-11.html 概念 在统计学中,直方图(英语:Histogra ...

  7. 详细解析图像处理 直方图均衡化计算

    什么是直方图均衡化 看一个图了解一下什么是直方图均衡化: 第一个图灰度都集中在左边,整体图像较暗 第二个图灰度都集中在右边,整体图像较亮 第三个图灰度都集中在中间,整体图像适中,但是雾蒙蒙的并不清晰 ...

  8. 数字图像处理学习笔记-图像处理基础1

    该学习笔记主要参考<数字图像处理(冈萨雷斯 第三版)>,该笔记主要分为"图像处理基础""图像频率域处理""图像分割"" ...

  9. 图像处理 直方图均衡化

    直方图均衡化的作用和优势: 作用:这种方法通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候.通过这种方法,亮度可以更好地在直方图上分布.这样就可以用于增强局部的对比度而不 ...

最新文章

  1. android 三级界面返回直接到一级界面
  2. 自动驾驶车路测法规出台,车辆需支持远程实时监控
  3. Python标准库:内置函数tuple([iterable])
  4. 解决github push错误The requested URL returned error: 403 Forbidden while accessing(转)
  5. 【Linux笔记(001) 】-- centos7 系统目录结构与文件
  6. 简单DP (Preparing for Xtreme 12.0) | STL map使用
  7. 取得Access自增标识字段在插入数据后的id值
  8. Java之volatile如何保证可见性和指令重排序
  9. mysql创建gbk库_MYSQL创建utf-8和GBK格式数据库_MySQL
  10. 中兴光猫F412超级管理员密码获取
  11. 在Windows上安装TeXLive
  12. MySQL 主从幂等复制slave_exec_mode=IDEMPOTENT
  13. Java读写txt文件案例-统计学生名单
  14. linux常用命令(轻松入门linux)
  15. 一些杂事之后,该收心了
  16. asp.net抓取163邮箱联系人实现代码
  17. 实行会员制能够从哪些方面帮助到门店经营?
  18. 尚学堂Java学习日记Day1
  19. 敏捷 scrum_Scrum团队的敏捷度如何?
  20. Linux下有关可读可写可执行权限rwx:.sh:权限不够

热门文章

  1. 简单粗暴的方式解决eclipse下安装STS失败的问题
  2. 代理模式(Proxy模式)详解
  3. DML和DDL的定义和区别
  4. 7.01 计算平均值
  5. 干洗店洗鞋店小程序开发案例
  6. 什么是计算机用英语解释,常用计算机英语解释
  7. Linux服务器设置ssh私钥登录
  8. 关于Windows Server 2008安全防护
  9. iOS微信7.0.7版本来了,更新了这个几个功能,其中一个真的很好用
  10. java如何监听微信关注事件,Java后端接收用户关注以及发送消息或者取消微信公众号的操作...