1.2 理论基础
1.2.1 空域图像增强
根据图像处理空间的不同, 图像增强基本上可分为两大类: 频域处理法, 空域处理法.
频域处理法的基础是卷积定理, 其通过进行某种图像变换(如傅里叶变换, 小波变换等)得到频域结果并进行修改的方法来实现图像的增强处理.
空域处理法是直接对图像中的像素进行处理, 一般是以图像灰度映射变换为基础并且根据图像增强的目标来采用所需的映射变换, 常见的图像对比度增强, 图像的灰度层次优化等处理均属于空域处理法.
本案例主要介绍空域的直方图增强算法.
1.2.2 直方图均衡化
直方图是图像的一种统计表达形式, 对于一幅灰度图像来说, 其灰度统计直方图可以反映该图像中不同灰度级出现的统计情况. 一般而言, 图像的视觉效果和其直方图有对应关系, 通过调整或变换其直方图的形状会对图像显示效果有很大影响.
直方图均衡化主要用于增强灰度值动态范围偏小的图像的对比度. 该方法的基本思想是把原始图像的灰度统计直方图变换为均匀分布的形式, 这样就增加了像素灰度值的动态范围, 从而达到增强图像整体对比度的效果.
数值图像是离散化的矩阵, 其直方图可以被视为一个离散函数, 它表示数字图像中每一灰度级与其出现概率间的统计关系. 假设一幅数字图像 的像素总数为N, 表示第k个灰度级对应的灰度, 表示灰度为 的像素个数即频数, 用横坐标表示灰度级, 纵坐标表示频数, 则直方图可定义为 , 其中, 表示灰度出现的频率. 直方图在一定程度上能够反映数字图像的概述, 包括图像的灰度范围, 灰度分布, 整幅图的亮度均值和疑难对比度等, 并可以此为基础进行分析来得出对图像进一步处理的重要依据.
直方图均衡化就是把给定图像的直方图分布变换成均匀分布的直方图, 是一种较为常用的灰度增强算法. 有三个主要步骤:
- 预处理, 输入图像, 计算该图像直方图
- 灰度变换表, 根据输入图像的直方图计算灰度值变换表
- 查表变换, 执行变换, 表示对步骤1得到的直方图使用步骤2得到的灰度值变换表进行查表变换操作, 通过遍历整幅图像的每一个像元, 将原始图像的灰度值x放入变换表中, 可得到变换后的新灰度值
假设图像有n级灰度, 其第i级灰度出现的概率为, 则该级灰度所含的信息量为:
整幅图像的信息量为:
信息论已经证明, 具有均匀分布直方图的图像, 其信息量H最大, 即当时, (1.2)式有最大值.
代码
彩色图片直方图均衡化
import cv2
import numpy as np
img = cv2.imread("image0.jpg", 1)
cv2.imshow("src", img)
# 彩色图像均衡化,需要分解通道 对每一个通道均衡化
(b, g, r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
# 合并每一个通道
result = cv2.merge((bH, gH, rH))
cv2.imshow("dst", result)
cv2.waitKey(0)
YUV直方图均衡化
import cv2
import numpy as np
img = cv2.imread("image0.jpg", 1)
imgYUV = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
cv2.imshow("src", img)
channelsYUV = cv2.split(imgYUV)
channelsYUV[0] = cv2.equalizeHist(channelsYUV[0])
channels = cv2.merge(channelsYUV)
result = cv2.cvtColor(channels, cv2.COLOR_YCrCb2BGR)
cv2.imshow("dst", result)
cv2.waitKey(0)