图像增强的目的是为了改善图像的视觉效果,为了更便于人或机器的分析和处理,在不考虑图像降质(前提)的情况下,提高图像的可观性。灰度变换是一种典型的图像增强方法,我们通常把图像处理按照处理方法分成空域方法与频域方法两类,灰度变换是一种对点处理的空域处理方法。
一、灰度变换
将一个灰度区间映射到另一个灰度区间的变换称为灰度变换,g(x,y)=T[f(x,y)]g(x,y) = T[f(x,y)]g(x,y)=T[f(x,y)],灰度区间是指0−2550-2550−255的灰度值区间,000是黑色,255255255是白色。灰色变换可使图像动态范围加大,图像对比度扩展,图像清晰,特征明显。灰度变换可以分为线性变换和非线性变换。
1、线性变换
原始图像:f(x,y)f(x,y)f(x,y),灰度范围:[a,b][a,b][a,b],变换后的图像:g(x,y)g(x,y)g(x,y),灰度范围:[c,d][c,d][c,d],存在以下变换关系:
g(x,y)=d−cb−a[f(x,y)−a]+cg(x,y) =\frac{d-c}{b-a}[f(x,y)-a]+cg(x,y)=b−ad−c[f(x,y)−a]+c
2、非线性变换
灰度变换的非线性变换方法包括对数变换和指数变换,对数变换公式为g(x,y)=a+ln[f(x,y)+1]blncg(x,y) = a+\frac{\ln[f(x,y)+1]}{b\ln c}g(x,y)=a+blncln[f(x,y)+1],这个变换扩展低灰度区的对比度,压缩高灰度值。指数变换公式为g(x,y)=bc[f(x,y)−a]−1g(x,y)=b^{c[f(x,y)-a]}-1g(x,y)=bc[f(x,y)−a]−1,与对数变换相反, 指数变换对图像的高灰度区有较大的扩展。
线性灰度变换实例如下,
import cv2
import numpy as np
import matplotlib.pyplot as plt
import pylabdef grayTransformLine(img,c,d):#线性灰度变换img = img/255.0 #转换为0-1Min = img.min()Max = img.max()return (d-c)/(Max-Min)*(img-Min)+cdef main():img = cv2.imread('Lena.jpg',0)new_img = grayTransformLine(img,0.5,1)#变换到0.5-1,整体变亮new_img2 = grayTransformLine(img,0,0.5)#变换到0-0.5,整体变灰暗cv2.imshow('bright',new_img) cv2.imshow('dark',new_img2)cv2.waitKey(0)if __name__ == "__main__":main()
输出结果如下,
3、灰度直方图
图像中像素灰度分布的概率密度函数,设图像尺寸为M×NM×NM×N,共有KKK级灰度,并且具有灰度级rkr_krk的像素数为g(rk)g(r_k)g(rk),则有:p(rk)=g(rk)M×Np(r_k)=\frac{g(r_k)}{M×N}p(rk)=M×Ng(rk),下面我们来计算图像的灰度直方图。
import cv2
import numpy as np
import matplotlib.pyplot as plt
import pylabimg = cv2.imread('Lena.jpg',0)
#images:输入图像,channels:图像的通道,mask:掩膜图像,若计算整幅图则为none,histSize:灰度级的个数
#ranges:像素值的范围
hist_cv = cv2.calcHist(images=[img],channels=[0],mask=None,histSize=[256],ranges=[0,255])
plt.plot(hist_cv)
pylab.show()
上述两幅图的灰度直方图如下所示,
明显看出,第一幅图的灰度分布集中在高值部分,因此整幅图高亮,第二幅图的灰度分布集中在低值部分,整幅图呈灰暗。
4、直方图均衡化
将原始图像的直方图变换为均匀分布的形式,从而增加像素灰度值的动态范围,达到增强图像整体对比度的效果。直方图均衡是一种非线性变换,以牺牲图像的等级为代价。
实现代码如下,
import cv2
import matplotlib.pyplot as plt
import pylabimg = cv2.imread('Lena.jpg',0)
res = cv2.equalizeHist(img) #均衡化
plt.subplot(121),plt.imshow(img,'gray')
plt.subplot(122),plt.imshow(res,'gray')
pylab.show()
均衡化的结果如下,
我们可以看到,均衡化后的图像灰度分布更加均匀,图像对比度明显增强。
上述的均衡化方法是全局上的均衡,有些时候这种操作并不好,会把某些不该调整的部分给调整。Opencv提供另一种局部调整的均衡化,把整个图像分成许多小块,每个小块内部进行均衡化,这种方法叫做对比度受限的自适应直方图均衡化,对于图像直方图存在多峰的图像比较适用,实现代码如下,
import cv2
import matplotlib.pyplot as plt
import pylabimg = cv2.imread('Lena.jpg',0)
#全局直方图均衡化
res = cv2.equalizeHist(img)
#自适应直方图均衡化
clahe = cv2.createCLAHE(clipLimit=2,tileGridSize=(10,10))#
cl1 = clahe.apply(img)
plt.subplot(121),plt.imshow(res,'gray')
plt.subplot(122),plt.imshow(cl1,'gray')
pylab.show()
两种均衡化的结果如下,
我们可以看出,相对于全局均衡化的结果,局部均衡化的效果更加自然一些。
二、同态增晰
我们之前讲到过傅里叶变换,经过傅里叶变换可以得到一幅图像的频域信息,我们可以对图像的频域进行操作达到滤波的目的。频域中的低频成分反映灰度的恒定分量,减弱低频成分可以起到缩小图像灰度范围的作用;频域中的高频成分反映图像的边界特性,增强高频成分可以提升图像的对比度(暗区细节增强并保留亮区细节)。
同态增晰是一种在频域中进行滤波操作的方法,目的是消除图像上照明不均的问题,增加暗区的图像细节,同时又不损失亮区的图像细节,它在频域中同时将图像亮度范围进行压缩和图像对比度进行增强。
同态滤波函数选用高通滤波器,消弱低频成分,加强高频成分。
同态增晰的过程如下,
未完待续