实验1-基于半色调技术的图像打印程序

1、摘要

本实验采用半色调技术对图像进行打印和显示,对于256灰度级的图像,用二值像素进行描述,降低了对灰度级别的需求。首先,读入需要打印的图像,改变他的尺寸,使其半色调变换后能够适应A4纸张的大小;然后,降低灰度级,把256灰度级的图片变换成10个灰度级;最后再把这个10灰度级照片用半色调技术打印出来,这个过程中图像的横纵座标都会变成以前的三倍。通过等偏爱曲线分析,对于细节较多的图像,降低灰度分辨率,对图像的视觉效果影响不大。

2、相关技术论述

1.1 图像半色调技术原理

用少量的色彩将一幅连续色调图像(如灰度图像和彩色图像)量化为一幅二值图像或是只有少数几种色彩的彩色图像,并且量化后图像在一定距离的视觉效果和原始图像相似的技术。
在这个实验中,也就是把256个灰度级的灰度图像转化为10个灰度级的图像,再用二值图像显示出来。原来的每个像素点量化为256个,每个像素点的灰度选取1到256个值中的一个。可是现在的表示方法不同,这10个灰度级是由3*3的一个矩阵形式来表示,这个矩阵中有9个黑白点,也就是变成了9个像素点,它的灰度只有0和1两种,也就是最后到每个像素而言,它是二值图像。

1.2 灰度渐变图像的生成

生成一个256*256像素的正方灰度渐变图像,第一列的灰度级为0,往后灰度值逐渐递增到255,每一列像素的灰度值相同。在matlab中灰度图像显示,需要把图像矩阵变成uint8型,才能正常的显示该灰度图像。在这个实验中,不需要对灰度渐变图像进行尺寸变换。

1.3 图像的尺寸变换

关于图像尺寸变换,首先要了解A4纸张的像素值,知道图像尺寸变化后的大小。其中,A4纸物理大小是21.6×27.9 cm 的打印区域,在这里为了达到实验的要求,使用最低分分辨率,72像素/英寸,A4纸尺寸的图像的像素就是595×842,所以图片必须小于等于198*280的像素,对于不满足像素要求的先进行图像缩小。

1.4 降低灰度级

图片的像素值已经缩小,还需要对图像进行灰度变换,把1到256分成10个灰度级,这里选用每隔26个灰度级为一个等级。图像中像素点除以26后,数据可能变成一个浮点型数据,这里需要用fix()函数对其进行取整,得到满足要求的整数值。

1.5 半色调技术填充

在这个试验中,产生10个3*3的矩阵,分别代表十个不同的灰度级,但是在电脑屏幕上显示的仍是1到256的灰度图像,这里需要对变换,使1和256对应二值图像的0和1。
另外半色调填充的图像,行列都变成了原来的3倍,在同一行中,每次填充后都需要变成原来的3倍,即
在这里插入图片描述
这里用公式(i-1)*3+1来表示它们的变化。

3、 总体实现方案

在这里插入图片描述
把整个程序分成三个大模块:图像的输入或图像的生成、半色调打印技术对图像的处理,以及图像的输出。
其中半色调打印技术也由三个部分组成:需要对图像的尺寸进行变化,即对图像的空间分辨率进行变化;对图像的灰度级变换,即对图像的灰度分辨率进行变化;还有对图像的半色调技术的灰度级填充。
在这个程序设计中,无论是读入图像,还是生成灰度渐变图像,相对于半色调打印程序来说,都可以做一个外部图像的输入部分,而图像处理完成后对图像输出显示。

4、实验结果与分析

4.1 实验结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.2 实验分析

为了便于比较,把图像最后缩放到相同大小。要在A4纸上打印,所以需要先对图像进行缩放,故图2、5、8变的相对模糊。
图1具有少量的细节图像,图2具有中等程度细节的图像,图3具有大量细节的图像,如《数字图像处理》图2.22中所示,在等偏爱曲线中,横轴N表示空间分辨率,纵轴k表示k比特的灰度分辨率,当图像中的细节增加时,等偏爱图像会变得更加垂直,也就是空间分辨率N不变的情况下,对于有大量细节的图像,只需要较少的灰度级就可以表示。可能的原因是,人眼对接近的灰度级不太敏感,当k值(灰度分辨率)减小时,对比度明显增强,人眼感受到的图像质量反而改善了,能得到相同的视觉效果。

5、程序

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('半色调打印技术输出图像'); 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章