数字图像处理(二)——Matlab实现灰度变换及直方图修正计算

实验内容

一、自选一幅背景较复杂、前景目标较多的交通图像,编程实现如下内容,并写出实验报告。
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是从原始图到规定图累积分布概率值的简单的一一对应,满足:累积概率值差 最小的灰度级。
在这里插入图片描述

  • 4
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值