图像增强算法汇总(直方图均衡化、拉普拉斯、Log变换、gamma伽马变换)附MATLAB代码

一、图像增强算法介绍

图像增强算法常见于对图像的亮度、对比度、饱和度、色调等进行调节,增加其清晰度,减少噪点等。图像增强往往经过多个算法的组合,完成上述功能,比如图像去燥等同于低通滤波器,增加清晰度则为高通滤波器,当然增强一副图像是为最后获取图像有用信息服务为主。一般的算法流程可为:图像去燥、增加清晰度(对比度)、灰度化或者获取图像边缘特征或者对图像进行卷积、二值化等,上述四个步骤往往可以通过不同的步骤进行实现,后续将针对此方面内容进行专题实验,列举其应用场景和处理特点。
本文章综合博客园部分文章,集大成,后续会有修订,有指导意见也请在评论区告知、万分感谢。

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:height  
    for j = 1: width  
        NumPixel(I(i,j) + 1) = NumPixel(I(i,j) + 1) + 1;%对应灰度值像素点数量增加一  
    end  
end  
%计算灰度分布密度  
ProbPixel = zeros(1,256);  
for i = 1:256  
    ProbPixel(i) = NumPixel(i) / (height * width * 1.0);  
end  
%计算累计直方图分布  
CumuPixel = zeros(1,256);  
for i = 1:256  
    if i == 1  
        CumuPixel(i) = ProbPixel(i);  
    else  
        CumuPixel(i) = CumuPixel(i - 1) + ProbPixel(i);  
    end  
end  
%累计分布取整  
CumuPixel = uint8(255 .* CumuPixel + 0.5);  
%对灰度值进行映射(均衡化)  
for i = 1:height  
    for j = 1: width  
        I(i,j) = CumuPixel(I(i,j));  
    end  
end  
  
subplot(223)  
imshow(I)%显示原始图像  
subplot(224)  
imhist(I)%显示原始图像直方图

1.2基于拉普拉斯算子的图像增强

利用拉普拉斯算子进行图像增强本质是利用图像的二次微分对图像进行蜕化,在图像领域中微分是锐化,积分是模糊,利用二次微分对图像进行蜕化即利用邻域像素提高对比度。在opencv中也有拉普拉斯函数,但那时生成了灰度图像,更多的求取边缘。

本次实验应用的卷积核为:
在这里插入图片描述

基于MATLAB代码

%拉普拉斯算子锐化图像,用二阶微分
%四邻接g(x,y)=[f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)]-4f(x,y)
clear
clc
I1=imread('./lena.jpg');
I=im2double(I1);
[m,n,c]=size(I);
A=zeros(m,n,c);
%分别处理R、G、B
%先对R进行处理
for i=2:m-1
    for j=2:n-1
        A(i,j,1)=I(i+1,j,1)+I(i-1,j,1)+I(i,j+1,1)+I(i,j-1,1)-4*I(i,j,1);
    end
end

%再对G进行处理
for i=2:m-1
    for j=2:n-1
        A(i,j,2)=I(i+1,j,2)+I(i-1,j,2)+I(i,j+1,2)+I(i,j-1,2)-4*I(i,j,2);
    end
end

%最后对B进行处理
for i=2:m-1
    for j=2:n-1
        A(i,j,3)=I(i+1,j,3)+I(i-1,j,3)+I(i,j+1,3)+I(i,j-1,3)-4*I(i,j,3);
    end
end
B=I-A;

 imwrite(B,'lena.tif','tif');
 imshow('./lena.jpg');title('原图');figure
 imshow('lena.tif');title('laplus图像')

用matlab自带的fspecial函数实现:

%matlab直接调用拉普拉斯方法
clear
clc
f=imread('./lena.jpg');
f2=im2double(f); %将f转换归一化的double类图像,然后进行滤波
w=fspecial('laplacian',0);
g1=imfilter(f,w,'replicate');
g=f-g1;
imshow(f);figure
imshow(g);

1.3基于对象Log变换的图像增强

对数变换可以将图像的低灰度值部分扩展,显示出低灰度部分更多的细节,将其高灰度值部分压缩,减少高灰度值部分的细节,从而达到强调图像低灰度部分的目的。变换方法:
在这里插入图片描述
对数变换对图像低灰度部分细节增强的功能过可以从对数图上直观理解:

x轴的0.4大约对应了y轴的0.8,即原图上(0-0.4)的低灰度部分经过对数运算后扩展到(0-0.8)的部分,而整个(0.4-1)的高灰度部分被投影到只有(0.8~1)的区间,这样就达到了扩展和增强低灰度部分,压缩高灰度部分的值的功能。
从上图还可以看到,对于不同的底数,底数越大,对低灰度部分的扩展就越强,对高灰度部分的压缩也就越强。

基于MATLAB的代码

% 规则化200×200
I=imread('lena.jpg');

%log变换
I_3=mat2gray(I); %对数变换不支持uint8类型的数据,将一个矩阵归一化为灰度图像的数据格式
J=log(I_3+1);
subplot(1,2,1);
imshow(I);
title('原图像');
subplot(1,2,2);
imshow(J);
title('对数变换后的图像');

1.4基于伽马变换的图像增强

伽马变换主要用于图像的校正,将灰度过高或者灰度过低的图片进行修正,增强对比度。变换公式就是对原图像上每一个像素值做乘积运算:
在这里插入图片描述
伽马变换对图像的修正作用其实就是通过增强低灰度或高灰度的细节实现的,从伽马曲线可以直观理解:
在这里插入图片描述
γ值以1为分界,值越小,对图像低灰度部分的扩展作用就越强,值越大,对图像高灰度部分的扩展作用就越强,通过不同的γ值,就可以达到增强低灰度或高灰度部分细节的作用。
伽马变换对于图像对比度偏低,并且整体亮度值偏高(对于于相机过曝)情况下的图像增强效果明显。

基于MATLAB代码

 f = imread('lena.jpg');  
I=rgb2gray(f);
f = mat2gray(I);

gamma1 = 0.1;
g_0_1 = f.^gamma1; 
gamma2 = 0.2;
g_0_2 = f.^gamma2; 
gamma3 = 0.4;
g_0_4 = f.^gamma3;
gamma4 = 0.6;
g_0_6 = f.^gamma4;
gamma5 = 0.8;
g_0_8 = f.^gamma5; 
gamma6 = 1;
g_1 = f.^gamma6;  
gamma7 = 2.5;
g_2_5 = f.^gamma7; 
gamma8 = 5;
g_5 = f.^gamma8; 
  
figure();  
subplot(3,3,1);  
imshow(f,[0 1]);  
xlabel('a).原图');  

subplot(3,3,2);  
imshow(g_0_1,[0 1]);  
xlabel('b).\gamma =0.1'); 

subplot(3,3,3);  
imshow(g_0_2,[0 1]);  
xlabel('c).\gamma =0.2'); 

subplot(3,3,4);  
imshow(g_0_4,[0 1]);  
xlabel('d).\gamma=0.4'); 

subplot(3,3,5);  
imshow(g_0_6,[0 1]);  
xlabel('e).\gamma=0.6'); 

subplot(3,3,6);  
imshow(g_0_8,[0 1]);  
xlabel('f).\gamma=0.8');  
  
subplot(3,3,7);  
imshow(g_1,[0 1]);  
xlabel('g).\gamma=1 i.e. 原图');  
  
subplot(3,3,8);  
imshow(g_2_5,[0 1]);  
xlabel('h).\gamma=2.5'); 

subplot(3,3,9);  
imshow(g_5,[0 1]);  
xlabel('i).\gamma=5'); 

二、实验结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、实验结果分析

实验结果分析为:
1、log函数变化对图像增强来讲,更多是对图像的对比度有所减弱,毕竟函数表现形式为像素值小的变大点,像素值大的变小点,所以对比度减小,亮度增加,正如图像所显示。所以目前看来log函数还是慎用,如果提高函数可以利用分段函数啊。
2、gamma函数图像增强,这个函数原理可以看出,当r大于1时,可以当做指数函数,小于则为log函数。在试验中我们常用r>1,实现图像对比度增强。从图像中可以看出,黑色更黑,白色更白。
3、laplus函数图像增强,本质是微分,所以为图像锐化,在图像锐化是明显凸显图像的细节,进而直观上提高图像对比度。
总结:图像增强方法不同,应用领域不同,更好的应用需要掌握灵活多变的方法。

四、参考文章及博客

1、图像增强算法:本文是该博客的大部分原理内容、原理部分稍有增改、其基于matlab部分代码为作者添加
2、译 Gamma CorrectionGamma Correction
3、数字图像处理 -灰度变换 之 gamma变换(gamma transformation)

发布了9 篇原创文章 · 获赞 13 · 访问量 9509

猜你喜欢

转载自blog.csdn.net/ABV09876543210/article/details/104858685