图像的灰度就是所谓的色阶或灰阶,是指亮度的明暗程度。也称中间色调主要用于传送图片,分别有16级、32级、64级三种方式,它采用矩阵处理方式将文件的像素处理成16、32、64级层次,使传送的图片更清晰。LED显示屏的灰度等级越高,颜色越丰富,色彩越艳丽;反之,显示颜色单一,变化简单。
本实验的图像素材是一种具有从黑到白256级灰度色阶的单色图像。该图像中的每个像素用8位无符号数据表示,因此像素点值介于黑白间的256种灰度中的一种。该图像只有灰度等级,而没有颜色的变化。
为了实现图像灰度级数的变化,本实验以2的幂次方将256级的灰度色阶进行量化。当图像的采样点数一定时,采用不同量化灰度级数的图像质量不一样。灰度级数越多,图像质量越好;反之图像质量越差。灰度级数小的极端情况就是二值图像。图1给出在MATLAB上运行的量化代码。
图1灰度级减少程序
其中imt = (ima / dfact) * dfact中的(ima / dfact)的计算结果为整数,略去了小数点后,再乘以dfact则达到了量化的作用,即不是dfact整数倍的灰度值都被归为dfact的整数倍。其中dfact为2的factor次幂,为了防止数据溢出,将factor设定在0到8之间。
内插是在诸如放大、收缩、旋转等图像处理任务中广泛使用的基本工具。使用内插用于调整图像尺寸大小也称为图像重取样方法。从根本上看,内插是用已知数据来估计未知位置的数值的处理,本实验将验证两种插值方法,分别是像素复制法和双线性插值法。
在本实验中,像素复制法只是简单的把原图像最近邻的灰度赋给每个新的位置,或者在缩小中简单地去除某一位置的像素信息,这种方法的优势是计算量很低,不用涉及类似于双线性插值和双三次内插的大量的浮点运算。其方法的缺点也是明显的,该方法在放大图片时会产生较为严重的失真,在缩小后再放大图片则失真更为明显。
使用双线性插值法,我们需要用4或4个以上最近邻点去估计给定位置的灰度。在数学上,双线性插值算法可以看成是两个变量间的线性插值的延伸。执行该过程的关键思路是先在一个方向上执行线性插值,然后再在另外一个方向上插值。用一个简单的数学表达式可以表示如下:
由上式可以看出,这个过程有大量的浮点运算,而图像的像素取值在0到255之间,最多只有256种结果,而计算出的f(x,y)很明显是个浮点数,我们还需要对该浮点数进行取整。
图2双线性插值法的大致思路
本实验素材分别取自冈萨雷斯主编的数字图象处理第三版中Fig2.19(a).jpg和Fig2.21(a).jpg。
图3不同灰度级的输出图像
图4基于像素复制法缩小为256*256后的图像
图5基于像素复制法放大为1024*1024后的图像
图6基于双线性插值法缩小为256*256后的图像
图7基于双线性插值法放大为1024*1024后的图像
本实验编写了一个以2的幂次方将一幅医学图像的灰度级数从256减少到2的程序,同时论证了像素复制法、双线性插值法这两种图像缩放技术。实验结果表明像素复制法具有运算速度快这一优点,对于一些只具有少量细节的图片不失为一种有效的图像缩放技术,但无法胜任具有大量细节的图像缩放工作,因为缩放后的图像失真严重。
双线性插值法是一种非线性内插法,通过使用4个或以上的临近点来估计新位置的灰度值,其处理结果更接近原图像的细节。但是,由于运算过程中包含大量浮点运算,使得计算量明显增加,在MATLAB上运行代码时便可明显感觉到。但是使用双线性插值法所得到的结果比像素复制法有重大的改进。
在图像缩放处理中,双线性内插和双三次内插是两种常用的典型方法。当然有可能使用更多的邻点和更复杂的方程来逼近原图像,但实际操作过程中需要考虑计算负担与效率问题。
以下给出简单的MATLAB代码:
% 第一部分是灰度级转换程序
function imt = grayleveldec(ima,factor)
%功能: 将原图像的灰度级按照2的foctor次幂减少
%输入参数:
% ima 输入的 8 bits灰度图像矩阵
% factor 灰度级减小因子
% 输出参数:
% imt 输出的灰度图像
% 规定factor的阈值在0到8之间
if factor < 0
factor = 0;
end
if factor > 8
factor = 8
end
dfact = uint8(2^factor);
imt = (ima / dfact) * dfact; %量化的过程
return;
function main()
%
%功能: 灰度级减少试验 将八种灰度级的输出图像显示在2*4的一张图片上
%
wH=2; wL=4;
ima=imread('fig2.21(a).jpg');
subplot(wH,wL,1)
imshow(ima);
title('原图像');
imt = grayleveldec(ima,1);
subplot(wH,wL,2)
imshow(imt);
title('128级灰度图像');
imt = grayleveldec(ima,2);
subplot(wH,wL,3)
imshow(imt);
title('64级灰度图像');
imt = grayleveldec(ima,3);
subplot(wH,wL,4)
imshow(imt);
title('32级灰度图像');
imt = grayleveldec(ima,4);
subplot(wH,wL,5)
imshow(imt);
title('16级灰度图像');
imt = grayleveldec(ima,5);
subplot(wH,wL,6)
imshow(imt);
title('8级灰度图像');
imt = grayleveldec(ima,6);
subplot(wH,wL,7)
imshow(imt);
title('4级灰度图像');
imt = grayleveldec(ima,7);
subplot(wH,wL,8)
imshow(imt);
title('2级灰度图像');
% 第二部分是基于像素复制法的图像缩放程序
function imt=change_pixels(ima,factor)
% 功能: 基于像素复制方式进行图像缩放
% 输入参数为一整数缩放因子
% 当缩放因子为负整数时代表缩小,正整数时代表放大
% wH=1; wL=2;
[xs,ys] = size(ima);
if factor<0 %缩放因子小于0时,判断为缩小图像
fa = abs(factor) %取绝对值
%imt = zeros((xs/fa),(xs/fa));
for i=1:(xs/fa)
for j=1:(ys/fa)
imt(i,j) = ima(i*fa,j*fa);
end
end
else if factor>0 %缩放因子大于0时,判断为放大图像
for i=1:(xs*factor)
for j=1:(ys*factor)
imt(i,j) = ima(ceil(i/factor),ceil(j/factor));
% round(x):四舍五入至最近整数
% fix(x):无论正负,舍去小数至最近整数
% floor(x):下取整,即舍去正小数至最近整数
% ceil(x):上取整,即加入正小数至最近整数
end
end
else
imt = ima;
end
end
return;
% 第三部分是基于双线性插值法的图像缩放程序
function imt=change_2lines()%(ima,xs,ys)
%
% 基于双线性插值技术进行图像缩放
% 输入参数为结果图像的水平和竖直方向的像素数 x和y
%
%xs = 1024;
%ys = 1024;
imt = uint8(zeros(xs,ys));
ima=imread('Fig2.19(a).jpg');
[imax,imay] = size(ima);
x = xs/imax; %缩放倍数
y = ys/imay; %缩放倍数
if x>1 || y>1
x = fix(x); %缩放倍数
y = fix(y); %缩放倍数
for m=1:xs
for n=1:ys
outx = (m-1)/x+1; %求输出图像各点的位置
outy = (n-1)/y+1;
%要求各点到邻近点的距离,先求出四个邻近点的位置
xk = fix(outx);
yk = fix(outy);
%可求出距离,写为xd和yd
xd = outx - xk;
yd = outy - yk;
if outx1 || y<1
% x = fix(x); %缩放倍数
% for m=1:xs
% for n=1:ys
% outx = (m-1)/x+1; %求输出图像各点的位置
% outy = (n-1)/y+1;
% %要求各点到邻近点的距离,先求出四个邻近点的位置
% xk = fix(outx);
% yk = fix(outy);
% %可求出距离,写为xd和yd
% xd = outx - xk;
% yd = outy - yk;
%
% if outx1
% y = fix(y); %缩放倍数
% for m=1:xs
% for n=1:ys
% outx = (m-1)/x+1; %求输出图像各点的位置
% outy = (n-1)/y+1;
% %要求各点到邻近点的距离,先求出四个邻近点的位置
% xk = fix(outx);
% yk = fix(outy);
% %可求出距离,写为xd和yd
% xd = outx - xk;
% yd = outy - yk;
%
% if outx