实验内容
一、自选一幅背景较复杂、前景目标较多的交通图像,编程实现如下内容,并写出实验报告。
1、分段线性变换各种情况的变换效果对比
2、对数、指数变换、取反等各种非线性变换的效果对比,务必有仿真结果及其详细的对比分析
二、1、已知某灰度图像数据如下,请对其进行直方图均衡化
2、已知某灰度图像数据如下,请用Gml和SML两种映射规则对其进行直方图规定化,对比变换后的直方图。
1.1线性变换代码:
由于给出的图像是3维RGB彩色图像,故在读取图像后可分为三个方向分别对图像进行操作,即A = I1(:,:,1);B = I1(:,:,2);C = I1(:,:,3);
然后可调用size()获取图像的矩阵像素大小,接着用for循环分别在行和列方向进行遍历操作,分析每一个像素点的大小,将0-255的灰度级分为三个区域,将0-100的灰度级像素点全部变为灰度级为1,将126-255的灰度级像素点全部变为灰度级为254,然后将100-125直接的灰度级像素点变为原像素点的二倍,即将该区域的灰度级进行拓展放大。
clear all
I1= imread('D:\1.jpg'); %读取图像
subplot(2,2,1),imshow(I1),title('原图');
A = I1(:,:,1);
subplot(2,2,2),imhist(A),title('原图直方图');
B = I1(:,:,2);
C = I1(:,:,3);
[rows , cols , colors] = size(I1);
for i=1:rows
for j=1:cols
if A(i,j)<=100
A(i,j)=1;
else if A(i,j)>100&A(i,j)<=125
A(i,j)=mod((A(i,j)*2),255);%取余
else
A(i,j)=254;
end
end
end
end
for i=1:rows
for j=1:cols
if B(i,j)<=100
B(i,j)=1;
else if B(i,j)>100&B(i,j)<=125
B(i,j)=mod((B(i,j)*2),255);
else
B(i,j)=254;
end
end
end
end
for i=1:rows
for j=1:cols
if C(i,j)<=100
C(i,j)=1;
else if C(i,j)>100&C(i,j)<=125
C(i,j)=mod((C(i,j)*2),255);
else
C(i,j)=254;
end
end
end
end
D(:,:,1)=A;
D(:,:,2)=B;
D(:,:,3)=C;
subplot(2,2,3),imshow(D),title('分段后的图')
subplot(2,2,4),imhist(A),title('分段直方图')
变换后的图像以及直方图如下图所示:
由变换后的直方图可以看出,灰度级为1和254的像素点个数非常多,将原图比较均衡的直方图分段线性变换后可得到自己感兴趣灰度级放大后的图像。
1.2指数变换
指数变化与分段线性变换相似,不同点是指数变换是对整体每个像素点的灰度级进行统一的取指数变换,将整体像素点的灰度值进行变换得到新的图。
clear all
I2 = imread('D:\1.jpg'); %读取图像
I1=im2double(I2);
I1=im2double(I2);
subplot(2,3,1),imshow(I1),title('原图','fontsize',16)
A = I1(:,:,1);
B = I1(:,:,2);
C = I1(:,:,3);
subplot(2,3,4),imhist(A),title('原图直方图','fontsize',16)
[rows , cols , colors] = size(I1);
for i=1:rows
for j=1:cols
A2(i,j)=A(i,j)^2;
B2(i,j)=B(i,j)^2;
C2(i,j)=C(i,j)^2;
A1(i,j)=A(i,j)^4;
B1(i,j)=B(i,j)^4;
C1(i,j)=C(i,j)^4;
end
end
D1(:,:,1)=A1;
D1(:,:,2)=B1;
D1(:,:,3)=C1;
D2(:,:,1)=A2;
D2(:,:,2)=B2;
D2(:,:,3)=C2;
subplot(2,3,2),imshow(D2),title('取以2为底的指数','fontsize',16)
subplot(2,3,5),imhist(A2),title('取对数后的直方图','fontsize',16)
subplot(2,3,3),imshow(D1),title('取4为底的对数','fontsize',16)
subplot(2,3,6),imhist(A1),title('取对数后的直方图','fontsize',16)
观察得到变换后的图像及直方图如图所示:
由结果可以看出,随着指数的不断增大,图像趋于灰度级0的像素点个数越来越多,图像变得越来越暗。
1.3对数变换:
对数变换与指数变换方法类似,对其整体像素点的灰度值进行取对数变换
clear all
I2 = imread('D:\1.jpg'); %读取图像
I1=im2double(I2);
subplot(2,3,1),imshow(I1),title('原图','fontsize',16)
A = I1(:,:,1);
B = I1(:,:,2);
C = I1(:,:,3);
subplot(2,3,4),imhist(A),title('原图直方图','fontsize',16)
[rows , cols , colors] = size(I1);
for i=1:rows
for j=1:cols
A1(i,j)=log10(A(i,j)+1);
B1(i,j)=log10(B(i,j)+1);
C1(i,j)=log10(C(i,j)+1);
A2(i,j)=log(A(i,j)+1)/log(5);
B2(i,j)=log(B(i,j)+1)/log(5);
C2(i,j)=log(C(i,j)+1)/log(5);
end
end
D1(:,:,1)=A1;
D1(:,:,2)=B1;
D1(:,:,3)=C1;
D2(:,:,1)=A2;
D2(:,:,2)=B2;
D2(:,:,3)=C2;
subplot(2,3,2),imshow(D2),title('取5为底的对数','fontsize',16)
subplot(2,3,5),imhist(A2),title('取对数后的直方图','fontsize',16)
subplot(2,3,3),imshow(D1),title('取10为底的对数','fontsize',16)
subplot(2,3,6),imhist(A1),title('取对数后的直方图','fontsize',16)
得到变换后的图像及直方图如图所示:
观察结果发现图像越来越趋于0,图像变得越来越暗,增强一副图像中较暗部分的细节。
1.4取反变换:
clear all
I1 = imread('D:\1.jpg'); %读取图像
A = I1(:,:,1);
B = I1(:,:,2);
C = I1(:,:,3);
subplot(2,2,1),imshow(I1),title('原图','fontsize',16)
subplot(2,2,2),imhist(A),title('原图直方图','fontsize',16)
[rows , cols , colors] = size(I1);
for i=1:rows
for j=1:cols
A(i,j)=255-A(i,j);
B(i,j)=255-B(i,j);
C(i,j)=255-C(i,j);
end
end
D(:,:,1)=A;
D(:,:,2)=B;
D(:,:,3)=C;
subplot(2,2,3),imshow(D),title('取反','fontsize',16)
subplot(2,2,4),imhist(A),title('取反直方图','fontsize',16)
其直方图与原图刚好对称。
2.1图像均衡化
先将图像转换为二维的灰度图,再用for循环统计每个灰度级点的个数,并进行归一化处理,求得概率值,然后获得累计概率值,并进行相应的均衡化变化,然后分别将灰度值为0-255直接的每个像素点的灰度值改为均衡化后的灰度值,得到均衡化后的图像。
clear all
I2 = imread('D:\3.jpg'); %读取图像
I1=rgb2gray(I2); %将彩色图转化为二维的灰度图
subplot(2,2,1),imshow(I1),title('原图','fontsize',16)
[row,col]=size(I1); %获取图像的像素点个数
a=zeros(1,256);
a1=zeros(1,256);
for i=0:255
a(i+1)=sum(I1(:)==i)/(row*col); %统计每个灰度级点的个数,
%并进行归一化处理,求得概率值
a1(i+1)=sum(I1(:)==i);
end
subplot(2,2,2),bar(0:255,a1),title('原图','fontsize',16)
b=zeros(1,256);
for i=1:256
for j=1:i
b(i)=b(i)+a(j); %获得累积概率值
end
end
c=zeros(1,256);
for i=1:256
c(i)=round(b(i)*255); %进行相应的变化
end
I3=I1;
for i=0:255
I3(find(I1==i))=c(i+1); %将灰度值为i的像素点的灰度值改为均
%衡化后的灰度值
end
a2=zeros(1,256);
for i=0:255
a2(i+1)=sum(I3(:)==i);
end
subplot(2,2,3),imshow(I3),title('均衡化后的图','fontsize',16)
subplot(2,2,4),bar(0:255,a2),title('均衡化后直方图','fontsize',16)
由图可以看出,通过图像均衡化处理后,可将原本不清晰的雾天图像变得较为清晰。
图像求均衡化步骤如下:
2.2直方图规定化
以上是GML映射规则,而SML映射与GML恰好相反,SML是从原始图到规定图累积分布概率值的简单的一一对应,满足:累积概率值差 最小的灰度级。