摘 要:本实验采用半色调技术对图像进行打印和显示。使用实验后面所给出了用点模式近似表示的0到9,10个灰度级来表示一张图片。每一个灰度级用一个3*3的黑白点模式表示。用3*3全黑点近似表示灰度级为0的黑色灰度级,3*3全白点近似表示灰度级为9的白色灰度级。其它的点模式表示这二者之间的灰度级。由于用3*3个像素点代替原来一个像素点,因此在有限的打印面积上需要考虑图像尺寸的大小,故需要对输入图像进行预处理。在此基础上,编写一个生成尺寸为256*256大小的灰度渐变测试图像的程序。输出图像第1列像素灰度为0,第2列像素灰度为1,以此类推,最后1列像素灰度为255,并将这张图片作为半色调技术的打印素材。本实验的输出图像可以在A4纸上打印而不会超出区域,该实验是在MATLAB R2014a平台上实现。
本实验采用半色调技术对图像进行打印和显示。使用实验后面所给出了用点模式近似表示的10个灰度级来表示一张图片。每一个灰度级用一个3*3的黑白点模式表示。用3*3全黑点近似表示灰度级为0的黑色灰度级,3*3全白点近似表示灰度级为9的白色灰度级。因此,我构建一个三位矩阵来表示10个灰度级,其MATLAB代码段如图1所示。
图1.10阶灰度矩阵
图2给出了将一张经过半色调技术处理过后的图片进行局部放大的图片,可以看到每个元素均按照10个灰度级的矩阵来排列。
图2.局部放大的处理后的照片
由于用3*3个像素点代替原来一个像素点,因此在有限的打印面积上需要考虑图像尺寸的大小,故需要对输入图像进行预处理,若判断读入的图像尺寸过大,调用函数imresize()缩小图像。该函数用于对图像做缩放处理。输入help imresize获得该函数的帮助信息,该函数的调用格式如下:
⑴ B = imresize(A, scale) 返回的图像B的长宽是图像A的长宽的scale倍。scale大于1,则放大图像;scale小于1则缩小图像,scale的取值范围为0到10之间。
⑵ B = imresize(A, [numrows numcols]) numrows和numcols分别指定目标图像的高度和宽度。这种格式允许图像缩放后长宽比例和原图像长宽比例不相同。
⑶ [...] = imresize(..., method) method参数用于指定在改变图像尺寸时所使用的算法,可以为以下几种图3 灰度渐变图像:
'nearest':采用最近邻插值算法;
'bilinear':采用双线性插值算法;
'bicubic':采用双三次插值算法,R2014a版本默认为这种算法。
⑷ [Y newmap] = imresize(X, map, scale)
⑸ [...] = imresize(..., parameter, value, ...)
构造一256*256大小的矩阵,利用简单的循环语句赋予每列元素从0到255的值,即可调用函数imshow()输出渐变图像,如图3所示。
图3.灰度渐变图像
以下给出4幅经过半色调打印技术处理前后的图,其中半色调处理之前已进行必要的图像缩放处理!对比图2和图3可看出图像其实进行了小幅度的缩小。素材分别是是图2生成的灰度渐变图像和冈萨雷斯主编的数字图像处理第三版中的图片Fig2.22(a).jpg、Fig2.22(b).jpg、Fig2.22(c).jpg。
图4.缩放处理后、半色调处理前的渐变图像
图5.经过半色调打印技术输出的256*256渐变图像
图6.缩放处理后、半色调处理前的Fig2.22(a).jpg图像
图7.经过半色调打印技术输出的Fig2.22(a).jpg图像
图8.缩放处理后、半色调处理前的Fig2.22(b).jpg图像
图9.经过半色调打印技术输出的Fig2.22(b).jpg图像
图10.缩放处理后、半色调处理前的Fig2.22(c).jpg图像
图11经过半色调打印技术输出的Fig2.22(c).jpg图像
本实验要求输出的半色调打印图像的尺寸不能超过A4纸的大小,因此首先需要对图像进行缩放,必然导致图像细节的丢失,故可以看到经过半色调打印技术输出后的图像显得较为模糊。
而从Fig2.22(a).jpg、Fig2.22(b).jpg、Fig2.22(c).jpg处理后的对比可以看出,(a)所含的细节较少,(c)所包含的细节最多,而Fig2.22(c).jpg处理前后的两幅图像效果更为接近。与等偏爱曲线的结论相同,即:对具有大量细节的图像,只需要较少的灰度级别就可以较好地表示。
以下给出Matlab代码:
% 灰度级转换程序
function imp = grayleveldec(ima)
%
% ima 为输入的8 bits灰度图像矩阵
% 把输入图像量化到10灰度级别 255/28=9
% imt 输出的灰度图像
% dfact = uint8(256/10);
imp = fix(double(ima) / 26) ;
return;
% 生成尺寸为256 x 256大小的渐变图像的程序
function z=change()
z=zeros(256,256); % 建立一个256*256的空矩阵
for i=1:256
z(:,i) = ones(256,1) * (i-1); % 到这一步生成的值为double类型,须转换为8位无符号整形
end
z = uint8(z);
imshow(z);
% 以下为主函数main()
function main()
% 假设输入图片dpi为70,在A4纸尺寸(即尺寸为595*842)内利用半色调技术打印图像 %
% wH=1; wL=2;
M=zeros(3,3,10); %建立3*3的10级别的灰度矩阵,各元素取值只有0和255两种情况
M(1:3,1:3,1)=255.*[0 0 0;0 0 0;0 0 0];
M(1:3,1:3,2)=255.*[0 1 0;0 0 0;0 0 0];
M(1:3,1:3,3)=255.*[0 1 0;0 0 0;0 0 1];
M(1:3,1:3,4)=255.*[1 1 0;0 0 0;0 0 1];
M(1:3,1:3,5)=255.*[1 1 0;0 0 0;1 0 1];
M(1:3,1:3,6)=255.*[1 1 1;0 0 0;1 0 1];
M(1:3,1:3,7)=255.*[1 1 1;0 0 1;1 0 1];
M(1:3,1:3,8)=255.*[1 1 1;0 0 1;1 1 1];
M(1:3,1:3,9)=255.*[1 1 1;1 0 1;1 1 1];
M(1:3,1:3,10)=255.*[1 1 1;1 1 1;1 1 1];
ima= imread('Fig2.22(c).jpg');%change(); 读取照片Fig2.19(a).jpg
% A4纸的尺寸的图像的像素是595×842,由于打印图像是用3*3的矩阵代替原图像一个像素点,应保证输入图像尺寸小于等于198*280
[xs,ys] = size(ima); %得到原图像的大小
imt=ima;
while (xs>=198||ys>=280) %若图片尺寸过大,则要缩小图片
imt=imresize(imt,0.8); %调用函数imresize,其中0.8为缩放因子
[xs,ys] = size(imt);
end
y=zeros(xs*3,ys*3);
imp=grayleveldec(imt); % imp代表各元素取值从1到10 ,10个等级的灰度矩阵
% subplot(wH,wL,1);
imshow(imt);
title('输入图像(处理为适合在A4纸上打印的图像)');
imwrite(imt,'input4.jpg');
for (i=1:xs)
for (j=1:ys)
gray= imp(i,j);
y(((i-1)*3+1):i*3,((j-1)*3+1):j*3)=M(1:3,1:3,gray+1); % 将三维矩阵M映射到各像素点上
end
end
y=uint8(y);
% subplot(wH,wL,2);
%imshow(y);
%title('半色调技术打印的输出图像');
imwrite(y,'output4.jpg');