Image Printing Program Based on Halftoning

Posted yuyaweibest

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Image Printing Program Based on Halftoning相关的知识,希望对你有一定的参考价值。

一、摘 要:

  本次实验使用半色调技术对图像进行打印并显示。在本实验中,用点模式近似表示10个灰度级,每一个灰度级用一个3*3的点模式表示。用黑点全部填充的3*3近似表示灰度级为0的黑色灰度级,全部填充白点的3*3模式近似表示灰度级为9的白色灰度级,其他的点模式介于这二者之间的灰度级。基于这种点模式的灰度级打印方案来打印图像,使得输入图像的每一个像素将对应于打印图像的3*3个像素,图像在水平及竖直方向上的空间分辨率近似减少为原始图像的33.3%。本次实验,利用这种半色调技术对给定的图像进行打印、分析,并检验了等偏爱曲线。为了使打印图像不超过A4纸的打印范围(21.6*27.9cm),对输入图像添加了尺寸调整的预处理,同时设计一个大小渐变的256*256图像测试程序来检验半色调技术打印方案。

二、技术论述:
  本次实验采用的是半色调打印技术,将灰度映射成3*3的点阵,256个灰度级别需要量化成10个点模式,每一个灰度级用一个3*3的点模式表示。用黑点全部填充的3*3表示灰度级为0的黑色灰度级,全部填充白点的3*3模式近似表示灰度级为9的白色灰度级,其他的点模式是介于这二者之间的灰度级。其对应关系如下:
            
  其中grayi,j为图像在(i, j)处的灰度级别,doti,j为量化后的灰度级别,即对应的点阵。10个点阵分别如图2.1所示:
  

                 图2.1 10个灰度级别对应的点阵
  如果采用上述半色调技术打印,则输入图像中的每一个像素对应打印图像的3*3个像素,最终打印图像的长度和宽度分别变成输入图像的3倍,所以为了保证打印图像不超过A4纸的打印区域,需要对输入图像进行预处理,调整尺寸。当设定的分辨率为96像素/英寸时,调整前图像的尺寸应不超过272*351.5(A4纸尺寸*96/(2.54*3))。
  
             表1.1执行本实验中半色调灰度图像打印程序前后,图像的尺寸变化情况
   

                           表1.1
  本次实验中,调整图像的尺寸是通过调用函数imresize()来实现,改变图像尺寸时常用的算法有三种:最近邻内插法、双线性内插法和双三次内插法,本试验基于R2014a版本,调用的是双三次内插算法(默认)。
  
三、试验结果讨论:
1.测试半色调技术打印

   编写MATLAB程序,生成一个256*256的大小渐变的测试图像,如图3.1(a)所示,图像的灰度级从左到右依次变化。然后使用半色调技术打印方案将测试图像打印出来,得到的输出的图像如图3.1(b)所示:

  
 

                图3.1 (a)渐变测试图像(256*256)
                     (b)半色调技术打印的图3.1(a)图像(768*768)

    从输出的结果来看,虽然图像量化后一些渐变过渡的细节丢失了,但是图像的整体轮廓并没有太大的变化,故半色调打印技术在某种程度是可行的。

2.半色调技术的点模式

                                图3.2半色调技术的3*3点模式

3.验证等偏爱曲线的结论

   等偏爱曲线的结论:对于有大量细节的图像,可能只需很少的灰度级别来表示。采用半色调打印技术对数字图像处理第三版图2.22(a)到(c)的三幅图像进行打印,为了便于比较,以下3幅尺寸较大的打印图像都和输入图像等大显示,得到对比结果如图3.3所示:


                      图3.3三幅图像分别采用半色调打印技术的对比结果
    其中(a1)(b1)(c1)为原图像,(a2)(b2)(c2)是使用半色调打印技术输出图像
    从图3.3的对比结果中可以看出, (a1)图具有少量细节,(c1)图具有大量细节,(b1)介于中间,但结果(c1)与(c2)两幅图像更接近。本实验将灰度级别为256级的灰度级图像量化成灰度级仅10级的图像。从图3.3中,(a1)与(a2)、(b1)与(b2)、(c1)与(c2)的比较可以得出,等偏爱曲线的结论是成立的,即对具有大量细节的图像只需要较少的灰度级就可以很好的表示。

附录: MATLAB代码

function halftoning()
%基于半色调技术的灰度图像打印程序
%获取图像,可以通过修改x的imread路径来改变图片
%获取图像大小
x=imread('Fig2.22(b).jpg');
figure,imshow(x)
[M,N]=size(x);
disp([M,N]);
%调整输入图像大小 
%当设定分辨率为96像素/英寸,输入图像必须小于等于272*351.5
if (M>272||N>351)
    scale1=272/M;
    scale2=351/N;
end
if (scale1<=scale2)
        scale=scale1;
else
        scale=scale2;
    x=imresize(x,scale);
end
[m,n]=size(x);
imwrite(x,'Fig2.22(b)_next.jpg');
%用三维矩阵表示半色调技术的点模式   
dots=zeros(3,3,10);
%1表示白点,0表示黑点
dots(:,:,1)=[0 0 0;0 0 0;0 0 0]*255;
dots(:,:,2)=[0 1 0;0 0 0;0 0 0]*255;
dots(:,:,3)=[0 1 0;0 0 0;0 0 1]*255;
dots(:,:,4)=[1 1 0;0 0 0;0 0 1]*255;
dots(:,:,5)=[1 1 0;0 0 0;1 0 1]*255;
dots(:,:,6)=[1 1 1;0 0 0;1 0 1]*255;
dots(:,:,7)=[1 1 1;0 0 1;1 0 1]*255;
level(:,:,8)=[1 1 1;0 0 1;1 1 1]*255;
dots(:,:,9)=[1 1 1;1 0 1;1 1 1]*255;
dots(:,:,10)=[1 1 1;1 1 1;1 1 1]*255;
figure
subplot(2,5,1),imshow(dots (:,:,1)),xlabel('0')
subplot(2,5,2),imshow(dots (:,:,2)),xlabel('1')
subplot(2,5,3),imshow(dots (:,:,3)),xlabel('2')
subplot(2,5,4),imshow(dots (:,:,4)),xlabel('3'  )
subplot(2,5,5),imshow(dots (:,:,5)),xlabel('4')
subplot(2,5,6),imshow(dots (:,:,6)),xlabel('5')
subplot(2,5,7),imshow(dots (:,:,7)),xlabel('6')
subplot(2,5,8),imshow(dots (:,:,8)),xlabel('7')
subplot(2,5,9),imshow(dots (:,:,9)),xlabel('8')
subplot(2,5,10),imshow(dots (:,:,10)),xlabel('9')

%将原灰度图像的256个灰度级量化为10个灰度级
x_next=fix(double(x)/25.6);
y=zeros(m*3,n*3);
%将三维矩阵映射到各像素点上
for i=1:m
    for j=1:n
        gray=x_next(i,j);
        y(((i-1)*3+1):i*3,((j-1)*3+1):j*3)=dots(:,:,gray+1);
    end
end
y=uint8(y);
figure,imshow(y);
imwrite(y,'image_halftoning.jpg');

%生成256*256大小的渐变测试图像
test=ones(256,1);
test=test-1;
for i=1:255
    test(:,i+1)=test(:,i)+1;
end
test=uint8(test);
figure,imshow(test);
imwrite(test,'image_test.jpg');
x=test;
x_next=fix(double(x)/25.6);
[m,n]=size(x);
y=zeros(m*3,n*3);
%将三维矩阵映射到各像素点上
for i=1:m
    for j=1:n
        gray=x_next(i,j);
        y(((i-1)*3+1):i*3,((j-1)*3+1):j*3)=dots(:,:,gray+1);
    end
end
y=uint8(y);
figure,imshow(y);
imwrite(y,'test_halftoning.jpg');
end

以上是关于Image Printing Program Based on Halftoning的主要内容,如果未能解决你的问题,请参考以下文章

sh Bash - 检查流程示例 - 来自http://stackoverflow.com/questions/7708715/check-if-program-is-running-with-ba

笨办法学Python - 习题8-10: Printing & Printing, Printing

'UInt32 System.Printing.PrintQueue.GetDpiX(System.Printing.ILegacyDevice)问题解决方法

System.Printing.PrintQueue QueueStatus 未更新

Mono 是不是支持 System.Drawing 和 System.Drawing.Printing? [关闭]

浅谈 Java Printing