图像处理与图像识别笔记(三)图像增强1

图像增强的目的是为了改善图像的视觉效果,为了更便于人或机器的分析和处理,在不考虑图像降质(前提)的情况下,提高图像的可观性。灰度变换是一种典型的图像增强方法,我们通常把图像处理按照处理方法分成空域方法频域方法两类,灰度变换是一种对点处理的空域处理方法。

一、灰度变换

将一个灰度区间映射到另一个灰度区间的变换称为灰度变换, g ( x , y ) = T [ f ( x , y ) ] g(x,y) = T[f(x,y)] ,灰度区间是指 0 255 0-255 的灰度值区间, 0 0 是黑色, 255 255 是白色。灰色变换可使图像动态范围加大,图像对比度扩展,图像清晰,特征明显。灰度变换可以分为线性变换和非线性变换。
1、线性变换
原始图像: f ( x , y ) f(x,y) ,灰度范围: [ a , b ] [a,b] ,变换后的图像: g ( x , y ) g(x,y) ,灰度范围: [ c , d ] [c,d] ,存在以下变换关系:

g ( x , y ) = d c b a [ f ( x , y ) a ] + c g(x,y) =\frac{d-c}{b-a}[f(x,y)-a]+c

2、非线性变换
灰度变换的非线性变换方法包括对数变换和指数变换,对数变换公式为 g ( x , y ) = a + ln [ f ( x , y ) + 1 ] b ln c g(x,y) = a+\frac{\ln[f(x,y)+1]}{b\ln c} ,这个变换扩展低灰度区的对比度,压缩高灰度值。指数变换公式为 g ( x , y ) = b c [ f ( x , y ) a ] 1 g(x,y)=b^{c[f(x,y)-a]}-1 ,与对数变换相反, 指数变换对图像的高灰度区有较大的扩展。

线性灰度变换实例如下,

import cv2
import numpy as np
import matplotlib.pyplot as plt 
import pylab

def grayTransformLine(img,c,d):#线性灰度变换
	img = img/255.0	#转换为0-1
	Min = img.min()
	Max = img.max()
	return (d-c)/(Max-Min)*(img-Min)+c

def 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 × N M×N ,共有 K K 级灰度,并且具有灰度级 r k r_k 的像素数为 g ( r k ) g(r_k) ,则有: p ( r k ) = g ( r k ) M × N p(r_k)=\frac{g(r_k)}{M×N} ,下面我们来计算图像的灰度直方图。

import cv2
import numpy as np
import matplotlib.pyplot as plt 
import pylab

img = 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 pylab

img = 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 pylab

img = 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()

两种均衡化的结果如下,

我们可以看出,相对于全局均衡化的结果,局部均衡化的效果更加自然一些。

二、同态增晰

我们之前讲到过傅里叶变换,经过傅里叶变换可以得到一幅图像的频域信息,我们可以对图像的频域进行操作达到滤波的目的。频域中的低频成分反映灰度的恒定分量,减弱低频成分可以起到缩小图像灰度范围的作用;频域中的高频成分反映图像的边界特性,增强高频成分可以提升图像的对比度(暗区细节增强并保留亮区细节)。
同态增晰是一种在频域中进行滤波操作的方法,目的是消除图像上照明不均的问题,增加暗区的图像细节,同时又不损失亮区的图像细节,它在频域中同时将图像亮度范围进行压缩和图像对比度进行增强。
同态滤波函数选用高通滤波器,消弱低频成分,加强高频成分。

同态增晰的过程如下,

未完待续

猜你喜欢

转载自blog.csdn.net/weixin_35747666/article/details/83114194