数字图像处理在matlab中的应用
1. 图像的缩放
图像的缩放是图像的空间域变换操作,可以认为是在输入图像和输出图像之间进行像素-像素变换。图像插值操作是图像缩放的基本方法,基本原理是,估计像素点之间位置的像素值,将输入图像和输出图像的变换在数字图像的约束下得以完善,有效的填充图像可能出现的空白点。
图像的插值包括三种方法:1.最近邻插值,该算法中,输出图像中每一个像素点的值就是与该点在输入图像中变换位置最临近采样点的值。2.双线性插值,该方法的输出像素值是它在输入图像中2*2邻域采样点的平均值。3.双三次插值,相比于双线性插值,其插值邻域大小为4*4,插值效果好,但相应计算量也较大。
Matlab图像处理工具箱中的函数imresize可以对图像进行缩放操作,同时指定以上所介绍的插值方法作为其函数。以下基于matlab实现图像“hd1.bmp”的不同方式的缩放(这里设置放大倍数为2倍)
%图像缩放操作代码:
>> J=imread('hd1.bmp'); %图像的读入
>> x1=imresize(J,2); %将图像以最近邻插值放大两倍
局部直方图均衡化>> x2=imresize(J,2,'bilinear'); %将图像以双线性插值放大两倍
>> x3=imresize(J,2,'bicubic'); %将图像以双三次插值放大两倍
>> figure,imshow(J) %图像输出显示
>> figure,imshow(x1)
>> figure,imshow(x2)
>>figure,imshow(x3)
输入输出图像对比
图1-1 原图输出
图1-2 最近邻插值放大2倍输出
图1-3 双线性插值放大2倍输出
图1-4双三次插值放大2倍输出
2. 图像的点处理-灰度变换/直方图调整
点处理是通过像元亮度值(灰度值)的变换来实现的。灰度变换是一种简单实用的方法,它可使图像动态范围增大,图像对比度扩展,图像变清晰,特征明显。灰度变换可以分为比例线性变换、分段线性变换和非线性灰度变换。
2.1 比例线性变换
比例线性变换是对单波段逐个像元进行处理的,它是将原图亮度值动态范围按线性关系式扩展到指定范围或整个动态范围。假定原图像f(x,y)的灰度范围是[a,b],希望变换后图像的动态范围是[c,d],则可以用一下公式来实现变换:
(1-1)
以下是比例线性变换的程序设计及实现:
>> x=imread('airforce.bmp'); %图像文件读入
>> I=rgbgray2(x); %该语句由后期修改,修改后影响原图输出效果
>> figure,imshow(I); %原图显示输出
>> f0=0;g0=0;
>> f1=10;g1=10;
>> f2=180;g2=1800;
>> f3=255;g3=255; %定义点以确定线段(此处随机定义)
>> figure,plot([f0,f1,f2,f3],[g0,g1,g2,g3])
>> axistight,xlabel('f'),ylabel('g')
>> title('intensitytransformation') %绘制变换曲线
>> r1=(g1-g0)/(f1-f0);
>> b1=g0-r1*f0;
>> r2=(g2-g1)/(f2-f1);
>> b2=g1-r2*f1;
>> r3=(g3-g2)/(f3-f2);
>> b3=g2-r3*f2; %根据变量曲线点求出变量关系式
>> [m,n]=size(I);
>> J=double(I);
>> for i=1:m
for j=1:n
f=J(i,j);
g(i,j)=0;
if(f>=f1)&(f<=f2)
g(i,j)=r1*f+b2;
elseif(f>=f2)&(f<=f3)
g(i,j)=r3*f+b3; %计算各图像元变换后灰度值
end
end
end
>> figure,imshow(mat2gray(g)) %输出变换后灰度图像
以下是程序运行结果:
图2-1 原图像
图2-2 绘制出的变换曲线
图2-3 比例线性变换处理后图像输出
2.2 分段线性变换
分段线性变换是为了突出人们感兴趣的目标或亮度值区间,要求局部扩展亮度值范围。它可以有效地利用有限个灰度级,达到最大限度增强图像中有用信息的目的。假设感兴趣的区域是(a,b),可以采用以下的分段变换公式:
(2-2)
下面利用分段线性变换来对图像进行处理,假定感兴趣的区间是(30,180),可以得到分段线性变换程序如下:
%分段线性变换
>> x=imread('airforce2.bmp');
>> I=rgbgray2(x); %该语句由后期修改,修改后影响原图输出效果
>> figure,imshow(I) %显示原图像
>> f0=0;g0=0;
>> f1=30;g1=10;
>> f2=180;g2=220;
>> f3=255;g3=255; %设点,给出感兴趣的区间
>> figure,plot([f0,f1,f2,f3],[g0,g1,g2,g3])
>> axistight,xlabel('f'),ylabel('g')
>> title('分段线性变换曲线') %绘制变换曲线
>> r1=(g1-g0)/(f1-f0);
>> b1=g0-r1*f0;
>> r2=(g2-g1)/(r2-r1);
>> r2=(g2-g1)/(f2-f1);
>> b2=g1-r2*f1;
>> r3=(g3-g2)/(f3-f2);
>> b3=g2-r3*f2; %求变换关系式
>> [m,n]=size(I);
>> J=double(I);
>> for i=1:m
for j=1:n
f=J(i,j);
g(i,j)=0;
if(f>=f1)&(f<=f2)
g(i,j)=r1*f+b2;
elseif(f>=f2)&(f<=f3)
g(i,j)=r3*f+b3;
end
end
end
>> figure,imshow(mat2gray(g)) %输出变换后图像
运行以上程序,得到结果:
图3-1 原图像
图 3-2 分段变换的变换曲线
图3-3 分段线性变换处理后图像输出
2.3 非线性灰度变换
非线性灰度变换对于要进行扩展的亮度范围是有选择的,扩展的程度是随着亮度值的变化而连续变化的,有两种方法:
(1) 对数变换,作用对图像的低亮度区有较大的扩展而对高亮度区压缩。
(2) 指数变换,此种变换可以对图像的高亮度区给予较大的扩展。
下面以对数变换为例,其目的与增强对比度相反,当原图的动态范围太大,超出了某些显示设备所允许的动态范围时,可采用对数形式的变换函数进行动态范围压缩:g=c log(1+f)。其中c是比例尺常数,下面采用对数形式的变换函数设计实现图像动态范围压缩:
% 以对数变换对图像进行非线性灰度处理
>> x=imread('nv3.bmp');
>> I=rgbgray2(x); %该语句后期由修改
>> figure,imshow(I)
Warning: Image is too big to fit on screen; displaying at 67%
> In imuitools\private\initSize at 73
In imshow at 262
>> c=255/log(256);
>> x=0:1:255;
>> y=c*log(1+x);
>> figure,plot(x,y)
>> axistight,xlabel('f'),ylabel('g')
>> title('对数变化曲线')
>> [m,n]=size(I);
>> J=double(I);
>> for i=1:m
for j=1:n
g(i,j)=0;
g(i,j)=c*log(J(i,j)+1);
end
end
>> figure,imshow(mat2gray(g))
运行以上程序得出结果:
图 4-1 原图像
图 4-2 对数变换曲线
图 4-3 对数变换后图像效果显示
2.4 直方图均衡化
一般情况下,如果图像的灰度分别集中在较窄的区间,从而引起图像细节的模糊,为了使图像细节清晰,并使一些目标得到突出,达到增强图像的目的,可通过改善各部分亮度的比例关系,即通过直方图的方法来实现。
直方图均衡化是将一已知灰度概率密度分布的图像,经过某种变换变成一幅具有均匀灰度概率密度分布的新图像,其结果是扩展了像元取值的动态范围,从而达到了增强图像对比度的效果。
下面是直方图均质化的变换源程序:
>> x=imread('nv.bmp'); %图像文件读入
>> y=rgb2gray(x);
> In imuitools\private\initSize at 73
In imshow at 262
>> figure,imhist(y) %原图直方图输出
>> z=histeq(y); %直方图均值化
>> figure,imshow(y) %显示源图像
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论