python图像增强算法_图像增强算法(直⽅图均衡化、拉普拉
斯、Log、伽马变换)...
⼀、图像增强算法原理
图像增强算法常见于对图像的亮度、对⽐度、饱和度、⾊调等进⾏调节,增加其清晰度,减少噪点等。图像增强往往经过多个算法的组合,完成上述功能,⽐如图像去燥等同于低通滤波器,增加清晰度则为⾼通滤波器,当然增强⼀副图像是为最后获取图像有⽤信息服务为主。⼀般的算法流程可为:图像去燥、增加清晰度(对⽐度)、灰度化或者获取图像边缘特征或者对图像进⾏卷积、⼆值化等,上述四个步骤往往可以通过不同的步骤进⾏实现,后续将针对此⽅⾯内容进⾏专题实验,列举其应⽤场景和处理特点。
本⽂章是⼀篇综合性⽂章,算是⼀篇抛砖引⽟的⽂章,有均衡化、提⾼对⽐度、降低对⽐度的算法。
1.1 基于直⽅图均衡化的图像增强
图像对⽐度增强的⽅法可以分为两种:直接对⽐度增强⽅法,间接对⽐度增强⽅法。直⽅图拉伸和直⽅图均衡化是常见的间接对⽐度增强⽅法。直⽅图拉伸是利⽤对⽐度拉伸对直⽅图进⾏调整,扩⼤前景和背景灰度的差别,这种⽅法可以通过线性和⾮线性的⽅法来实现,其中ps 中就是利⽤此⽅法提⾼对⽐度;
直⽅图均衡化则是利⽤累积函数对灰度值进⾏调整,实现对⽐度的增强。
直⽅图均衡化处理原理:将原始图像的灰度图从⽐较集中的某个灰度区间均匀分布在整个灰度空间中,实现对图像的⾮线性拉伸,重新分配图像像素值。
算法应⽤场景:
1、算法的本质是重新分布图像的像素值,增加了许多局部的对⽐度,整体的对⽐度没有进⾏太⼤改变,所以应⽤图像为图像有⽤数据的对⽐度相近是,例如:X光图像,可以将曝光过度或曝光不⾜照⽚进⾏更好的显⽰,或者是背景及前景太亮或太暗的图像⾮常有⽤。
2、算法当然也有缺点,具体表现为:变换后的图像灰度级减少,某些细节减少;某些图像有⾼峰值,则处理后对⽐度不⾃然的过分增强。
算法实现特点:
1、均衡化过程:直⽅图均衡化保证在图像像素映射过程中原来的⼤⼩关系保持不变,即较亮的区域依旧较亮,较暗的依旧较暗,只是对⽐度增加,不能明暗颠倒;保证像素映射函数的值域在0和255之间。累积分布函数是单增长函数,并且值域是0到1。
2、累积分布函数实现过程:
⽐较概率分布函数和累积分布函数,前者的⼆维图像是参差不齐的,后者是单调递增的。直⽅图均衡化过程中,映射⽅法是
其中,n是图像中像素的总和,
是当前灰度级的像素个数,L是图像中可能的灰度级总数。
来看看通过上述公式怎样实现的拉伸。假设有如下图像:
得图像的统计信息如下图所⽰,并根据统计信息完成灰度值映射:
映射后的图像如下所⽰:
算法伪代码:
局部直方图均衡化1、计算原始灰度图像的像素概率分布
2、根据像素概率分布获取图像累积分布函数
3、根据映射函数获取变换后的图像
算法matlab代码:
%直⽅图均衡化
I= imread('rice.png');
[height,width]=size(I);
figure
subplot(221)
imshow(I)%显⽰原始图像
subplot(222)
imhist(I)%显⽰原始图像直⽅图%进⾏像素灰度统计;
NumPixel= zeros(1,256);%统计各灰度数⽬,共256个灰度级for i = 1:heightfor j = 1: width
NumPixel(I(i,j)+ 1) = NumPixel(I(i,j) + 1) + 1;%对应灰度值像素点数量增加⼀
end
end%计算灰度分布密度
ProbPixel= zeros(1,256);for i = 1:256ProbPixel(i)= NumPixel(i) / (height * width * 1.0);
end%计算累计直⽅图分布
CumuPixel= zeros(1,256);for i = 1:256
if i == 1CumuPixel(i)=ProbPixel(i);elseCumuPixel(i)= CumuPixel(i - 1) +ProbPixel(i);
end
end%累计分布取整
CumuPixel= uint8(255 .* CumuPixel + 0.5);%对灰度值进⾏映射(均衡化)for i = 1:heightfor j = 1: width I(i,j)=CumuPixel(I(i,j));
end
end
subplot(223)
imshow(I)%显⽰原始图像
subplot(224)
imhist(I)%显⽰原始图像直⽅图
1.2 基于拉普拉斯算⼦的图像增强
利⽤拉普拉斯算⼦进⾏图像增强本质是利⽤图像的⼆次微分对图像进⾏蜕化,在图像领域中微分是锐化,积分是模糊,利⽤⼆次微分对图像进⾏蜕化即利⽤邻域像素提⾼对⽐度。在opencv中也有拉普拉
斯函数,但那时⽣成了灰度图像,更多的求取边缘,具体源码还没研究,其中原理可以参考我前⼀篇⽂章,针对拉普拉斯有个详细的介绍。
本次实验应⽤的卷积核为:
1.3 基于对象Log变换的图像增强
对数变换可以将图像的低灰度值部分扩展,显⽰出低灰度部分更多的细节,将其⾼灰度值部分压缩,减少⾼灰度值部分的细节,从⽽达到强调图像低灰度部分的⽬的。变换⽅法:
对数变换对图像低灰度部分细节增强的功能过可以从对数图上直观理解:
x轴的0.4⼤约对应了y轴的0.8,即原图上0~0.4的低灰度部分经过对数运算后扩展到0~0.8的部分,⽽整个0.4~1的⾼灰度部分被投影到只有0.8~1的区间,这样就达到了扩展和增强低灰度部分,压缩⾼灰度部分的值的功能。
从上图还可以看到,对于不同的底数,底数越⼤,对低灰度部分的扩展就越强,对⾼灰度部分的压缩也就越强。
1.4 基于伽马变换的图像增强
伽马变换主要⽤于图像的校正,将灰度过⾼或者灰度过低的图⽚进⾏修正,增强对⽐度。变换公式就是对原图像上每⼀个像素值做乘积运算:
伽马变换对图像的修正作⽤其实就是通过增强低灰度或⾼灰度的细节实现的,从伽马曲线可以直观理解:
γ值以1为分界,值越⼩,对图像低灰度部分的扩展作⽤就越强,值越⼤,对图像⾼灰度部分的扩展作⽤就越强,通过不同的γ值,就可以达到增强低灰度或⾼灰度部分细节的作⽤。
伽马变换对于图像对⽐度偏低,并且整体亮度值偏⾼(对于于相机过曝)情况下的图像增强效果明显。
⼆、测试代码
根据上述讲解,本⽂利⽤python进⾏编程实验,代码如下:
def preprocess(filename, i):
image=cv2.imread(filename)
image_gray=cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
# 直⽅图均衡增强
image_equal=cv2.equalizeHist(image_gray)
r,g,b=cv2.split(image)
r1=cv2.equalizeHist(r)
g1=cv2.equalizeHist(g)
b1=cv2.equalizeHist(b)
image_equal_([r1, g1, b1])
# 拉普拉斯算法增强
kernel= np.array([ [0, -1, 0],
[-1, 5, -1],
[0, -1, 0] ])
image_lap=cv2.filter2D(image,cv2.CV_8UC3 , kernel)
# 对象算法增强
image_log= np.uint8(np.log(np.array(image) +1))
# 转换成8bit图像显⽰
# 伽马变换
fgamma= 2image_gamma= np.uint8(np.power((np.array(image)/255.0),fgamma)*255.0)
三、实验结果及分析
(src) (log)
(laplus) (gamma)
(equal)
(src) (log)
(laplus) (gamma)
(equal)
实验结果分析为:
1、log函数变化对图像增强来讲,更多是对图像的对⽐度有所减弱,毕竟函数表现形式为像素值⼩的变⼤点,像素值⼤的变⼩点,所以对⽐度减⼩,亮度增加,正如图像所显⽰。所以⽬前看来log函数还是慎⽤,如果提⾼函数可以利⽤分段函数啊。
2、gamma函数图像增强,这个函数原理可以看出,当r⼤于1时,可以当做指数函数,⼩于则为log函数。在试验中我们常⽤r>1,实现图像对⽐度增强。从图像中可以看出,⿊⾊更⿊,⽩⾊更⽩。
3、laplus函数图像增强,本质是微分,所以为图像锐化,在图像锐化是明显凸显图像的细节,进⽽直观上提⾼图像对⽐度。
4、equal函数本质是重新分布图像的像素值,直观我们发现图像颜⾊发⽣变化,但对⽐度是有所提⾼,当然对于这组的图像的作⽤,没有体现。
总结:图像增强⽅法不同,应⽤领域不同,更好的应⽤需要掌握灵活多变的⽅法。
四、参考⽂章
1、OpenCV图像增强算法实现(直⽅图均衡化、拉普拉斯、Log、Gamma):本⽂基本在此基础上进⾏编程实现,原理可以参考这,同时⾃⼰对⾥⾯的概念问题进⾏详解。
2、直⽅图均衡化原理:本⽂详细介绍了直⽅图均衡化的原理,并通过opencv进⾏函数实现。
3、直⽅图均衡化详解及编程实现:⽂中对直⽅图均衡化的应⽤特点和缺点进⾏分析,并根据算法原理通过matlab实现了算法。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论