本实验采用半色调技术对图像进行打印和显示,对于256灰度级的图像,用二值像素进行描述,降低了对灰度级别的需求。首先,读入需要打印的图像,改变他的尺寸,使其半色调变换后能够适应A4纸张的大小;然后,降低灰度级,把256灰度级的图片变换成10个灰度级;最后再把这个10灰度级照片用半色调技术打印出来,这个过程中图像的横纵坐标都会变成以前的三倍。通过等偏爱曲线分析,对于细节较多的图像,降低灰度分辨率,对图像的视觉效果影响不大。
用少量的色彩将一幅连续色调图像(如灰度图像和彩色图像)量化为一幅二值图像或是只有少数几种色彩的彩色图像,并且量化后图像在一定距离的视觉效果和原始图像相似的技术。
在这个实验中,也就是把256个灰度级的灰度图像转化为10个灰度级的图像,再用二值图像显示出来。原来的每个像素点量化为256个,每个像素点的灰度选取1到256个值中的一个。可是现在的表示方法不同,这10个灰度级是由3*3的一个矩阵形式来表示,这个矩阵中有9个黑白点,也就是变成了9个像素点,它的灰度只有0和1两种,也就是最后到每个像素而言,它是二值图像。
生成一个256*256像素的正方灰度渐变图像,第一列的灰度级为0,往后灰度值逐渐递增到255,每一列像素的灰度值相同。在matlab中灰度图像显示,需要把图像矩阵变成uint8型,才能正常的显示该灰度图像。在这个实验中,不需要对灰度渐变图像进行尺寸变换。
关于图像尺寸变换,首先要了解A4纸张的像素值,知道图像尺寸变化后的大小。其中,A4纸物理大小是21.6×27.9 cm 的打印区域,在这里为了达到实验的要求,使用最低分分辨率,72像素/英寸,A4纸尺寸的图像的像素就是595×842,所以图片必须小于等于198*280的像素,对于不满足像素要求的先进行图像缩小。
图片的像素值已经缩小,还需要对图像进行灰度变换,把1到256分成10个灰度级,这里选用每隔26个灰度级为一个等级。图像中像素点除以26后,数据可能变成一个浮点型数据,这里需要用fix()函数对其进行取整,得到满足要求的整数值。
在这个试验中,产生10个3*3的矩阵,分别代表十个不同的灰度级,但是在电脑屏幕上显示的仍是1到256的灰度图像,这里需要对变换,使1和256对应二值图像的0和1。
另外半色调填充的图像,行列都变成了原来的3倍,在同一行中,每次填充后都需要变成原来的3倍,即
这里用公式(i-1)*3+1来表示它们的变化。
把整个程序分成三个大模块:图像的输入或图像的生成、半色调打印技术对图像的处理,以及图像的输出。
其中半色调打印技术也由三个部分组成:需要对图像的尺寸进行变化,即对图像的空间分辨率进行变化;对图像的灰度级变换,即对图像的灰度分辨率进行变化;还有对图像的半色调技术的灰度级填充。
在这个程序设计中,无论是读入图像,还是生成灰度渐变图像,相对于半色调打印程序来说,都可以做一个外部图像的输入部分,而图像处理完成后对图像输出显示。
为了便于比较,把图像最后缩放到相同大小。要在A4纸上打印,所以需要先对图像进行缩放,故图2、5、8变的相对模糊。
图1具有少量的细节图像,图2具有中等程度细节的图像,图3具有大量细节的图像,如《数字图像处理》图2.22中所示,在等偏爱曲线中,横轴N表示空间分辨率,纵轴k表示k比特的灰度分辨率,当图像中的细节增加时,等偏爱图像会变得更加垂直,也就是空间分辨率N不变的情况下,对于有大量细节的图像,只需要较少的灰度级就可以表示。可能的原因是,人眼对接近的灰度级不太敏感,当k值(灰度分辨率)减小时,对比度明显增强,人眼感受到的图像质量反而改善了,能得到相同的视觉效果。
clear;clc;
%将原始图像读入Original这个数组变量
Original= imread('C:\Users\machenike\Desktop\DIP\pro1\Fig2.22(a).jpg');
%显示原始图像,和后面变化的图像做对比
figure(1) ;imshow(Original); title('原图像');
Change=Original;%图像将要发生变化,放入Change变量中
%得到原图像的大小
[x,y] = size(Change);
%原图像用半色调图像打印后会变大,A4纸可能不够打印,需要
%对图像进行缩放,A4纸尺寸的图像的像素就是595×842,所以
%图片必须小于等于198*280
while (x>=198||y>=280)
Change=imresize(Change,0.8); %调用函数imresize,其中设置缩放因子为0.8
[x,y] = size(Change);
end
%显示缩放后的图像
figure(2) ; imshow(Change); title('压缩变换后的图像');
%产生灰度级渐变图像
Gradual=zeros(256,256);%产生256*256的矩阵
for col=1:256
Gradual(1:256,col)=col-1;%所有行像素渐变,列像素不变
end
Gradual=uint8(Gradual); %只有转换成8位无符号整数型,才能显示图像
figure(3); imshow(Gradual);title('灰度渐变图像');
%%%降低灰度级
Interval=26; %原灰度级256,这里把间隔设置为26,分成是十个等级
B=zeros(x,y);%生成原图压缩后大小的矩阵
B=fix(Change/Interval); %把原图分成10个灰度级,调用fix取整
C=zeros(x*3,y*3);%生成半色调打印图像
%生成半色调图像的基本灰度级点
D0=[0 0 0;0 0 0;0 0 0];
D1=[0 1 0;0 0 0;0 0 0];
D2=[0 1 0;0 0 0;0 0 1];
D3=[1 1 0;0 0 0;0 0 1];
D4=[1 1 0;0 0 0;1 0 1];
D5=[1 1 1;0 0 0;1 0 1];
D6=[1 1 1;0 0 1;1 0 1];
D7=[1 1 1;0 0 1;1 1 1];
D8=[1 1 1;1 0 1;1 1 1];
D9=[1 1 1;1 1 1;1 1 1];
for i=0:9
Di=256.*D0; %半色调中是0和1二值打印,但在显示屏上对应的是0和256
end
for i=1:x
for j=1:y
switch B(i,j)
%这里C行和列都是1~3,4~6,7~9 ...显示,1--1,2--4,3--7,...
%用(i-1)*3+1表示
case 0
C(((i-1)*3+1):i*3,((j-1)*3+1):j*3)=D0;
case 1
C(((i-1)*3+1):i*3,((j-1)*3+1):j*3)=D1;
case 2
C(((i-1)*3+1):i*3,((j-1)*3+1):j*3)=D2;
case 3
C(((i-1)*3+1):i*3,((j-1)*3+1):j*3)=D3;
case 4
C(((i-1)*3+1):i*3,((j-1)*3+1):j*3)=D4;
case 5
C(((i-1)*3+1):i*3,((j-1)*3+1):j*3)=D5;
case 6
C(((i-1)*3+1):i*3,((j-1)*3+1):j*3)=D6;
case 7
C(((i-1)*3+1):i*3,((j-1)*3+1):j*3)=D7;
case 8
C(((i-1)*3+1):i*3,((j-1)*3+1):j*3)=D8;
otherwise
C(((i-1)*3+1):i*3,((j-1)*3+1):j*3)=D9;
end
end
end
figure(4), imshow(C); title('半色调打印技术输出图像');