本人qq号:226607573,欢迎互相讨论的伙伴们
毕设期间对python图像去雾的学习与总结
近年来,雾霾越来越严重,导致户外获取的图像严重退化,何如将户外获取的有雾图像复原成高质量的清晰图像,已成为众多研究者的共同目标。
常用的图像去雾方法有以下几种:
1.暗通道去雾
2.色阶调整去雾
3.直方图均衡化
4.Retinex
何凯明博士–暗通道去雾算法
原理:暗通道处理是一个假设, 在绝大多数非天空的局部区域里,某一些像素总会有至少一个颜色通道有很低的值。换言之,该区域光强度的最小值是个很小的数。
**
暗通道可以用下式表达:
暗通道先验的理论指出:
实际生活中造成暗原色中低通道值主要有三个因素:
- a)汽车、建筑物和城市中玻璃窗户的阴影,或者是树叶、树与岩石等自然景观的投影;
- b)色彩鲜艳的物体或表面,在RGB的三个通道中有些通道的值很低(比如绿色的草地/树/植物,红色或黄色的花朵/叶子,或者蓝色的水面);
- c)颜色较暗的物体或者表面,例如灰暗色的树干和石头。总之,自然景物中到处都是阴影或者彩色,
**
I(X)就是我们现在已经有的图像(待去雾的图像)
J(x)是我们要恢复的无雾的图像,A是全球大气光成分, t(x)为透射率
**
找出每个像素的RGB三通道的最小值、形成图像的暗通道图像
展示去雾效果
原图片
在这里插入图片描述
处理后图片
图片增强代码:
图片增强算法一:
def zmMinFilterGray(src, r=7): #如果比最小值小,则替换中心像
#素为最小值,如果中心像素比最大值大,则替换中心像素为最大值。s
'''最小值滤波,r是滤波器半径''' #求最小值滤波图像用来作为引导滤波的引导图像
'''if r <= 0:
return src
h, w = src.shape[:2]
I = src
res = np.minimum(I , I[[0]+range(h-1) , :]) #元素集的最小值计算
res = np.minimum(res, I[range(1,h)+[h-1], :])
I = res
res = np.minimum(I , I[:, [0]+range(w-1)])
res = np.minimum(res, I[:, range(1,w)+[w-1]])
return zmMinFilterGray(res, r-1)'''
return cv2.erode(src, np.ones((2 * r + 1, 2 * r + 1))) # 使用opencv的erode函数更高效
def guidedfilter(I, p, r, eps): #去雾1
#输入图像V1,引导图像p
height, width = I.shape #a,b是以像素k为窗口的周围的权重的均值
m_I = cv2.boxFilter(I, -1, (r, r)) #方框滤波,m_I 窗口W的均值
m_p = cv2.boxFilter(p, -1, (r, r)) #m_p = q受到噪声n污染的退化图像
m_Ip = cv2.boxFilter(I * p, -1, (r, r)) #I * P 的累加
cov_Ip = m_Ip - m_I * m_p #分子
m_II = cv2.boxFilter(I * I, -1, (r, r)) #用于求方差
var_I = m_II - m_I * m_I #窗口W的方差
a = cov_Ip / (var_I + eps) #a,b窗口中心位于 k 时该线性函数的不变系数
b = m_p - a * m_I
m_a = cv2.boxFilter(a, -1, (r, r))
m_b = cv2.boxFilter(b, -1, (r, r))
return m_a * I + m_b
def getV1(m, r, eps, w, maxV1): # 输入rgb图像,值范围[0,1] 去雾1
'''计算大气遮罩图像V1和光照值A, V1 = 1-t/A'''
V1 = np.min(m, 2) # 得到暗通道图像,每个像素RGB分量中的最小值
V1 = guidedfilter(V1, zmMinFilterGray(V1, 7), r, eps) # 使用引导滤波优化
bins = 2000
ht = np.histogram(V1, bins) # 计算大气光照A #写入直方图
d = np.cumsum(ht[0]) / float(V1.size) #元素累加
for lmax in range(bins - 1, 0, -1):
if d[lmax] <= 0.999:
break
A = np.mean(m, 2)[V1 >= ht[1][lmax]].max()
V1 = np.minimum(V1 * w, maxV1) # 对值范围进行限制
return V1, A
def deHaze(m, r=81, eps=0.001, w=0.9, maxV1=0.80, bGamma=False): #去雾1
Y = np.zeros(m.shape) #定义一个零矩阵
V1, A = getV1(m, r, eps, w, maxV1) # 得到遮罩图像和大气光照
for k in range(3):
Y[:, :, k] = (m[:, :, k] - V1) / (1 - V1 / A) # 颜色校正
Y = np.clip(Y, 0, 1)
if bGamma:
Y = Y ** (np.log(0.5) / np.log(Y.mean())) # gamma校正,默认不进行该操作
return Y
还在更新中。**
常用的图像增强方法有以下几种:
1.提高对比度
2.Gamma校正
3.直方图均衡化
均值滤波方法:对待处理的当前像素,选择一个模板,该模板为其邻近的若干个像素组成,用模板的均值来替代原像素的值的方法。
中值滤波方法:对待处理的当前像素,选择一个模板,该模板为其邻近的若干个像素组成,对模板的像素由小到大进行排序,再用模板的中值来替代原像素的值的方法。
使用python自带的图像处理库PIL的ImageEnhance模块
1、对比度:白色画面(最亮时)下的亮度除以黑色画面(最暗时)下的亮度
2、色彩饱和度::彩度除以明度,指色彩的鲜艳程度,也称色彩的纯度
3、色调:向负方向调节会显现红色,正方向调节则增加黄色。适合对肤色对象进行微调
4、锐度:是反映图像平面清晰度和图像边缘锐利程度的一个指标
展示增强效果
原图片
处理后图片
图片增强代码:
图片增强算法一:
def m_filter(x, y, step): # 增强
"""中值滤波函数"""
sum_s = [] # 定义空数组
for k in range(-int(step / 2), int(step / 2) + 1):
for m in range(-int(step / 2), int(step / 2) + 1):
sum_s.append(img_zq[x + k][y + m]) # 把模块的像素添加到空数组
sum_s.sort() # 对模板的像素由小到大进行排序
return sum_s[(int(step * step / 2) + 1)]
def Contrast_and_Brightness(alpha, beta, img): # 对比度、亮度增强 增强
"""使用公式f(x)=α.g(x)+β"""
# α调节对比度,β调节亮度
blank = np.zeros(img.shape, img.dtype) # 创建图片类型的零矩阵
dst = cv2.addWeighted(img, alpha, blank, 1 - alpha, beta) # 图像混合加权
return dst
def img_enhance():
# 亮度增强
enh_bri = ImageEnhance.Brightness(image)
brightness = 1.2
image_brightened = enh_bri.enhance(brightness)
# 色度增强
enh_col = ImageEnhance.Color(image_brightened)
color = 1.2
image_colored = enh_col.enhance(color)
# 对比度增强
enh_con = ImageEnhance.Contrast(image_colored)
contrast = 1.2
image_contrasted = enh_con.enhance(contrast)
# 锐度增强
enh_sha = ImageEnhance.Sharpness(image_contrasted)
sharpness = 3.0
image_sharped = enh_sha.enhance(sharpness)
还在更新中