实验3-图像强度变换和直方图均衡化

1 摘要

本实验主要采用对数变换方法和指数变换方法对图像的增强,通过调整其中的参数,得到最好的可视化增强效果,理解结果图像之间产生差异的主要原因。另外编写程序计算显示图像的灰度直方图,并采用直方图均衡化方法,增强图像效果。


2 相关技术

2.1 对数变换法图像增强

对数变换的通用形式为
在这里插入图片描述
其中c是一个常数,并假设 。该变换将输入中范围较窄的低灰度值映射为输出中较宽范围的灰度值,对输入较高的像素值则会压缩。使用这种类型的变换来扩展图像中的暗像素值,同时压缩更高灰度级的值。
不过对于执行这个对数变换后,灰度值不能映射到整个灰度,期望将导致的压缩值还原为显示的全部范围,对于这个实验中的8比特而言,可用以下语句:

gs= im2uint8(mat2gray(g));

使用函数mat2gray可将值限定在范围[0,1]内,函数im2uint8可将值限定在范围[0,255]内。

2.2 指数变换法图像增强

幂律变换的基本形式为
在这里插入图片描述
其中c和m为正常数。和对数变换相类似,部分m值的幂律曲线将较窄范围的暗色输入值映射为较宽范围的输出值。不过当m>1时,产生下凹的曲线,高灰度值将会扩展,低灰度值压缩,m<1时,产生上凸的曲线,低灰度值扩展,高灰度值压缩。

2.3 图像灰度直方图

图像的灰度直方图是用于表达图像灰度分布情况的统计图表,可以用一个1维的离散函数表示:
在这里插入图片描述
其中, 为图像的第k级灰度值, 是f(x,y)中具有灰度值 的像素的个数,n是图像像素总个数,L是总灰度级数。
直方图反映了在图像中取不同灰度值的像素在整幅图像中所占的比例,但在直方图中不含有像素在空间位置方面、或图像形状方面的任何信息。
在直方图的程序设计方面,主要要用统计每个灰度值的个数。这里用find(ima==i)函数查找图像中灰度为i的位置,然后统计个数,放入一个一维数组当中。

for i=1:256         %查找ima矩阵中各个值的个数,并且放入数组中
    x(i)=size(find(ima==(i-1)),1);  %find函数对ima查找,统计查找的个数
    y(i)=x(i)/(m*n);        %各个元素的概率
end

2.4 直方图均衡化增强

直方图均衡化是把原来相对集中的灰度值均匀分布在整个灰度范围,提高图像对比度,使其看起来更加的清晰。
在均衡化过程中有两个条件:
1、像素无论怎样映射,一定要保证原来的大小关系不变,原来较亮的区域依然较亮,较暗的区域依然较暗,只是和以前相比,对比度拉升,灰度值大小关系没有改变;
2、像素映射的值域应该在0L-1,不能越界,实验中灰度级是八位,所以像素映射函数的值域是0255之间。
累积分布函数满足这两个条件,单调递增(控制大小关系)和值域0~1(控制越界),因此,直方图均衡化中选用累积分布函数。
直方图均衡化算法主要分成三个步骤:
1、统计直方图每个灰度级出现的次数。用一个一维矩阵来存放0~255每个灰度级出现的次数,并且计算出每个像素出现的概率(归一化)。
2、累计归一化的直方图。计算出每个灰度值对应的累计分布。
3、计算新的像素值。累计分布函数乘以(L-1)得到新的像素值。
4、将原图像灰度值映射到新的像素值中。


3 实验结果与分析

3.1 对数变化法图像增强

在这里插入图片描述
如图1所示,通过对数变换,图像中较低的灰度值得到拉升,图片看起来更加的明亮、清晰,调整参数c,可以看出c=30时,视觉效果最好,能够清晰的看出细节。图像之间产生差异的主要原因是参数c的不同,导致图像灰度拉升的效果不一样,显示出来也略有不同。

3.2 指数变换法图像增强

在这里插入图片描述
如图2所示,通过指数变换,图像中较低的灰度值得到拉升,而且随着指数m的减小,拉升效果越明显,但这样也使图像产生了比较严重的失真。通过对比这几幅图像,m=0.3时,效果最好。这个时候图像最清晰,对比度最高。导致图像产生差异的原因,是由于指数的不同,图像的拉升效果发生变化,显示出不同的视觉效果。

3.3 直方图均衡化

在这里插入图片描述
在这里插入图片描述
如图4所示,图像像素的灰度值主要集中在灰度值较低的位置,对比度不明显,原图看起来不够清晰,现在通过直方图均衡化方法,使灰度值均匀的扩展到整个范围,直方图如图7所示,变化后的图像如图6,图6看起来对比度更高,细节显示的更加清晰。而映射值表如图4所示,把原来的灰度映射到新的均匀的像素中去。


4 程序

4.1 对数变换方法进行图像增强

ima = imread('C:\Users\machenike\Desktop\DIP\pro3\Fig3.08(a).jpg');
s20=uint8(20*(log(1+double(ima))));
s20=im2uint8(mat2gray(s20));
figure,
subplot(1,4,1),  imshow(ima);title('原图');
subplot(1,4,2),  imshow(s20);title('c=20');

## 4.2 指数变换方法进行图像增强
ima = imread('C:\Users\machenike\Desktop\DIP\pro3\Fig3.08(a).jpg');
s1=uint8(double(ima).^(0.1));%   整数只能升为整数幂,需要对ima取double型,imshow可以显示浮点型和整形
s1=im2uint8(mat2gray(s1));
subplot(1,5,1),  imshow(s1);title('m=0.1');

4.3 计算图像直方图

function [x,y]=pro3_3(ima)
% ima= imread('C:\Users\machenike\Desktop\DIP\pro3\Fig3.08(a).jpg');%读取图片信息
[m,n]=size(ima);    %计算图像的行列数
for i=1:256         %查找ima矩阵中各个值的个数,并且放入数组中
    x(i)=size(find(ima==(i-1)),1);  %find函数对ima查找,统计查找的个数
    y(i)=x(i)/(m*n);        %各个元素的概率
end
figure,bar(y);title('归一化直方图');
End

4.4 直方图均衡化

ima0 = imread('C:\Users\machenike\Desktop\DIP\pro3\Fig3.08(a).jpg');
figure,imshow(ima0);  %显示原图像
pro3_3(ima0);             %绘制直方图
ima=ima0+1;   %全部加1,矩阵下标必须为正整数或者逻辑数据
[m,n]=size(ima0);    %计算图像的行列数
for i=1:256         %查找ima矩阵中各个值的个数,并且放入数组中
    x(i)=size(find(ima==i),1);  %find函数对ima查找,统计查找的个数
    y(i)=x(i)/(m*n);        %各个元素的概率
end
 
sum=zeros(256,1);  %存放分布概率
z=zeros(256,1); %存放映射的灰度值
 
%求累积分布和映射的灰度值
for i=1:256
    if i==1
        sum(1,1)=y(1);
    else
        sum(i,1)=y(i)+sum(i-1);
    end
    z(i)=uint8(sum(i)*256);
end
ima1=zeros(m,n);
figure,bar(z);
%对灰度值进行映射
for j=1:m
    for k=1:n
           ima1(j,k)=(z(ima(j,k)));  
    end
end
ima1=uint8(ima1);  %对均衡化后的图像取整
figure,imshow(ima1);
pro3_3(ima1);
©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值