实验二:熟悉基于单像素空域图像增强方法

一、实验目的
1、熟悉基于单像素空域图像增强方法,理解并掌握直方图均衡化和规定化实现图像增强。
二、实验环境
Matlab R2022b
三、实验内容
3.1实验题目
1、对一幅低对比度分辨率的图像采用图像反转、对数变换及伽马较正方法实现图像增强,要求自己编写代码实现。(图自选)
2、对一幅低对比度分辨率的图像采用直方图均衡化和规定化方法(单映射或组映射)实现图像增强,分别采用系统函数和自己编写函数实现相应用功能。
3.2相关知识
1、图像反转
图像反转特别适用于增强嵌入图像暗色区域中的白色或灰色细节,特别是当黑色面积在尺寸上占主导地位时。图像反转的公式如下:
在这里插入图片描述
其中,s 为反转目标图像某点的灰度值,r 为原始图像对应点的灰度值,L为灰度级数。
2、对数变换
图像的对数变换主要的作用是压缩动态范围,原因是对数曲线在像素值较低的区域斜率大,在像素值较高的区域斜率较小,所以图像经过对数变换后,较暗区域的对比度将有所提升,所以就可以增强图像的暗部细节。
在这里插入图片描述
其中,c是一个常数,f是浮点数。对数变换可以将图像的低灰度值部分扩展,显示出低灰度部分更多的细节,将其高灰度值部分压缩,减少高灰度值部分的细节,从而达到图像偏暗的图像增强的目的,其逆变换可以强调高灰度。底数越大,对低灰度部分的强调就越强,对高灰度部分的压缩也就越强。相反的,如果想强调高灰度部分,则用反对数函数就可以了。
3、伽马变换
伽马变换主要用于图像的校正,将漂白的图片或者是过黑的图片,进行修正。伽马变换也常常用于显示屏的校正,这是一个非常常用的变换。与对数变换相似,Gamma变换属于非线性操作,非线性变换的主要目的是通过灰度值映射增强目标域数据分布,达到对比度增强的目的。Gamma变换可以根据参数变换的更加灵活,其灰度变换函数定义如下:
在这里插入图片描述
4、直方图均衡化
直方图均衡化是通过灰度变换将一幅图像转换为另一幅具有均衡直方图的图像,即在每个灰度级上都具有相同的象素点数的过程。处理后的图像直方图分布更均匀,图像在每个灰度级上都有像素点。从处理前后的图像可以看出,许多在原始图像中看不清楚的细节在直方图均衡化处理后所得到的图像中都变得十分清晰。
均衡化:建立映射表s,再根据映射表对各个像素进行映射变换。
在这里插入图片描述
5、规定化方法
直方图规定化就是通过一个灰度映像函数,将原灰度直方图改造成所希望的直方图,其关键是灰度映像函数。
6、系统自带函数
imhist(f):画出直方图函数,参数为要处理的图像;
histeq(f):直方图均衡化函数,参数为要处理的图像;
histeq(f,g2):直方图规定化函数,第一个参数为要处理的图像,第二个参数可为目标直方图或灰度级个数。
在这里插入图片描述
在编写函数实现直方图规定化(直方图匹配)时,同样的,首先处理出原图的直方图和被匹配图像的直方图。直方图匹配可以使用单映射实现,也可以使用组映射实现。在实现单映射时,把原图中的相应灰度值按累积概率密度映射成被匹配图像的累积概率密度对应的灰度值。在实现组映射时,把被匹配图像的相应灰度值按累积概率密度映射成原图相应累积概率密度时对应的灰度值,并且需要填补空缺值。
8、核心代码
(1)、下面代码实现了对一幅低对比度分辨率的图像采用图像反转方法实现图像增强。

clear all; clc;
img_1=imread('bb.jpg');
%图像反转
img_2=255-img_1;
%对比显示图像
subplot(1,2,1),imshow(img_1);
subplot(1,2,2),imshow(img_2);

(2)、下面代码实现了对一幅低对比度分辨率的图像采用对数变换方法实现图像增强。

clear all
clc
I=imread('bb.jpg');
I1=im2double(I);%对数运算设计小数,需将图片转为double ,相当于图片像素值除以255
subplot(1,2,1);
imshow(I1);
title('原图像');
L=log(I1*255+1)/log(256)*255;% I1*255得到图像原始的像素值,再进行对数运算 得到增强后的图像像素值
L1=uint8(L);
subplot(1,2,2);
imshow(L1);
title('经对数变换的图像');

(3)、下面代码实现了对一幅低对比度分辨率的图像采用伽马较正方法实现图像增强。

clear all
clc
I=imread('bb.jpg');%读取图像
I1=im2double(I);
subplot(2,3,1)
imshow(I1)
title('原图像')
I2=1.1*I1.^(0.75);
subplot(2,3,2);
imshow(I2);
title('系数=1.1 γ=0.75图像')
I3=1.1*I1.^(0.5);
subplot(2,3,3);
imshow(I3);
title('系数=1.1 γ=0.55图像')
I4=1.1*I1.^(1.3);
subplot(2,3,4);
imshow(I4);
title('系数=1.1 γ=1.3图像')
I5=1.1*I1.^(2);
subplot(2,3,5);
imshow(I5);
title('系数=1.1 γ=2图像')
I6=1.1*I1.^(6);
subplot(2,3,6);
imshow(I5);
title('系数=1.1 γ=6图像')

(4)、下面代码实现了对一幅低对比度分辨率的图像采用直方图均衡化和规定化方法(单映射或组映射)实现图像增强,采用系统函数实现相应用功能。

I=imread('bb.jpg');
%直方图均衡化:将原图像的直方图通过变换函数修正为均匀的直方图,然后按均衡直方图修改原图像。
A2 = histeq(I,64);%histeq(),第一个参数为要处理的图像,第二个参数为处理后的灰度级个数。
%直方图规定化:使原图像灰度直方图变成规定形状的直方图来对图像作修正,直方图均衡化是直方图规定化的一个特例。
h=0:255;
h=1-h/255;%目标直方图
A3 = histeq(I,h);

figure;
subplot(321),imshow(uint8(I));title("原图像");%原图
subplot(322),imhist(uint8(I));title("原图像直方图");%查看直方图
subplot(323),imshow(A2);title("直方图均衡化系统函数增强图像");  %显示线性增强结果图像
subplot(324),imhist(A2);title("直方图均衡化系统函数增强图像直方图");%查看直方图
subplot(325),imshow(A3);title("直方图规定化系统函数增强图像");  %显示线性增强结果图像
subplot(326),imhist(A3);title("直方图规定化系统函数增强图像直方图");%查看直方图


%figure;imhist(h);title("规定化系统函数  被匹配的直方图");%被匹配的直方图图像显示

(5)、下面代码实现了对一幅低对比度分辨率的图像采用直方图均衡化和规定化方法(单映射或组映射)实现图像增强,自己编写函数实现相应用功能。

f=imread('bb.jpg');
f1=imread('ff.jpg');
%f=rgb2gray(f);
%f1=rgb2gray(f1);
g1=imhist(f);%画出直方图
g2=imhist(f1);

%均衡化
[M,N]=size(f);%返回数组每一维的大小
pr=g1/M/N;
s=[];
s2=0;
L=size(pr);
for i=1:L           %映射规则
    s1=(L-1)*pr(i);
    s2=s2+s1;
    s=[s;s2];
end
s=s(:,1);

f_1=zeros(size(f));%zeros(n)产生n×n的全0方阵

%for i=1:M*N        %映射图像
for i=1:M        %映射图像
    for j =1:N
    f_1(i,j)=s(f(i,j)+1)-1;
    end
end
figure;
subplot(2,2,1);imshow(f);title('原图像');
subplot(2,2,2);imhist(f);title('原图像直方图');
subplot(2,2,3);imshow(uint8(f_1));title('均衡化图像');
subplot(2,2,4);imhist(uint8(f_1));title('均衡化图像直方图');

%规定化
[M1,N1,R]=size(f1);  %匹配图像均衡化
pr1=g2/M1/N1;
s_1=[];
s2=0;
L=size(pr1,1);
for i=1:L            %映射规则
    s1=(L-1)*pr1(i);
    s2=s2+s1;
    s_1=[s_1;s2];
end
s_1=s_1(:,1);
f_11=zeros(size(f1));

for i=1:M1*N1*R      %被均衡化的匹配图像
    if(f1(i)==0)
        f_11(i)=s_1(1);
    else
        f_11(i)=s_1(f1(i));
    end   
end
figure
subplot(2,2,1);imshow(f1);title('匹配图像');
subplot(2,2,2);imhist(f1);title('匹配图像直方图');
subplot(2,2,3);imshow(uint8(f_11));title('均衡化图像');
subplot(2,2,4);imhist(uint8(f_11));title('均衡化图像直方图');

[M1,N1]=size(f1);  %规定化(映射)
s=uint8(round(s)); %四舍五入取整,原图像映射表
s_1=uint8(round(s_1));%匹配图像映射表
s_2=zeros([L,1]);  %最终映射表
j=1;
for i=1:L   %求最终映射表
    a=find(s_1==s(i));
    if(a)
        if((i>2)&&(a(j)==s_2(i)))   %if((i>1)&&(a(j)==s_2(i-1)))
            j=j+1;
            if (j>=length(a))
                j=length(a);
            end
        else
            j=1;
        end
        b=a(j);
    else
        b=zhidao_nearest(double(s_1),s(i));
    end 
    s_2(i)=b;
end

f_2=zeros(size(f)); %像素通过映射表匹配
% for i=1:M*N
%     f_2(i)=s_2(f(i));
% end
for i=1:M        %映射图像
    for j =1:N
    f_2(i,j)=s_2(f(i,j)+1)-1;
    end
end

figure
subplot(2,3,1);imhist(f);title('原图像直方图');
subplot(2,3,2);imhist(f1);title('匹配图像直方图');
subplot(2,3,3);imhist(uint8(f_2));title('匹配后图像直方图');
subplot(2,3,4);imshow(f);title('原图像');
subplot(2,3,5);imshow(f1);title('匹配图像');
subplot(2,3,6);imshow(uint8(f_2));title('匹配后图像');

function y=zhidao_nearest(A,b) %查最接近数的下标
[Asort,index]=sort(abs(A(:)-double(b)));
y=A(index(1));
end

9、实验结果
(1)下图1实现了利用图像反转进行图像增强。下图中,左边图像为原始图像,右边图像为反转图像。
在这里插入图片描述
(2)下图2为利用对数变换进行图像增强结果。可以看出,图像对低灰度值部分扩展,增强了低灰度部分,显示出低灰度部分更多的细节。
在这里插入图片描述
(3)下图3为利用伽马变换进行图像增强结果。
在这里插入图片描述
可以看出,当 gamma>1 的时候,低灰度区域的动态值变小,高灰度区域的动态值变大,降低了低灰度区域图像的对比度,提高了高灰度值区域图像的对比度, 图像整体变暗。
当 gamma<1 的时候,低灰度区域的动态值变大,进而图像对比度增强,高灰度值区域,动态值变小,图像整体变亮。
(4)下图4为调用系统函数完成直方图均衡化和规定化方法(单映射或组映射)实现图像增强。
在这里插入图片描述
(5)利用直方图均衡化和规定化方法自己编写函数实现图像增强,下图5为原图像均衡化结果,图6为匹配图像均衡化结果,图7为自己编写函数图像增强处理结果。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看出自己编写的函数对原图的均衡化增强结果几乎是一致的,因为函数的基本原理是相同的。
四、实验心得
1、通过自编写Matlab函数学习了图像反转、对数变换及伽马较正方法实现图像增强的过程,对图像类型转换、代数原运算的原理加深理解;
2、了解了采用直方图均衡化和规定化方法(单映射或组映射)实现图像增强的原理过程,测试了系统函数和自己编写函数实现相应用功能的区别。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐