Image Printing Program Based on Halftoning (半色调打印技术)

来源:互联网 发布:程序员应该去的网站 编辑:程序博客网 时间:2024/06/16 09:07

摘 要:本实验采用半色调技术对图像进行打印和显示,半色调技术是一种基于点模式的灰度级图像打印方案。本实验利用10个不同的3 x 3的黑白点模式近似表示的10个灰度级。其中用黑点全部填充的3 x 3近似表示灰度级为0的黑色灰度级,全部填充白点的3 x 3模式近似表示灰度级为9的白色灰度级,其它的点模式表示这二者之间的灰度级。利用这种方案进行图像的打印时将减小图像的空间分辨率,将导致其尺寸增大,因此,为防止当原始图像过大时输出图像的尺寸大于A4纸的尺寸,编写了对应的调整原始图像尺寸的程序。同时编写了一个生成尺寸为256*256大小的渐变测试图像的程序,来检验所设计的半色调技术打印方案。同时利用此程序对课本图2.22(a)到(c)【冈萨雷斯,数字图像处理第三版】进行变换,以验证等偏爱曲线的结论。

(1)实验过程
分析:由实验要求知程序要实现三个功能1.图像大小判断与调整2.半色调变换3.生成渐变图像,因此将程序分成三个函数文件来做。
1.图像大小判断与调整
实验要求最终图像不得超过A4(210*297mm)纸的尺寸,查资料得标准印刷分辨率为300dpi,即A4纸像素尺寸大概为2480*3508,,由于进行半色调变换后图像的行和列都会增大三倍,所以进行图像大小调整时应将此倍率考虑在内,输入图像大小应小于row/3=826,column/3=1169。但由于示例图像都没有超过此尺寸,为了展示程序效果本实验将印刷分辨率设为96dpi,因此对应图像大小不应超过272*352。
在程序设计时利用输入变量dpi表示分辨率,并进行图像大小限制计算想要修改印刷分辨率时改变函数读入值即可。
2.半色调变换
由于半色调只有10个灰度级,因此必须先对读入图像矩阵进行量化成10个灰度级,在根据半色调点模式构造10个灰度级对应的矩阵,最后利用for循环对灰度级进行映射,串联成新的矩阵,输出即为最终图像。
3.生成渐变图像
构造空矩阵利用for循环进行矩阵串联即可输出渐变图像。
(2)实验结果
为了便于展示效果将原图和半色调图缩放到同一大小
图fig  图fig half

图fig2.22(a)   图fig2.22(a)half

图fig2.22(b)   图fig2.22(b)half

图fig2.22(c)   图fig2.22(c)half

观察图fig2.22(a)-图fig2.22(c)及其对应的半色调变换之后的图fig2.22(a)-图fig2.22(c)可知,其对应的半色调图像视觉效果随着原图像细节的增多越来越好。这正好符合等偏爱曲线的结论:对于具有大量细节的图像,可能只需要较少的灰度级就能将图像较好的展现出来。

附录程序代码:

%基于半色调技术的图像打印程序function y=halftoning_test()x=imread('Fig2.22(c).jpg');figure,subplot(1,2,1),imshow(x),title('原图片');x=size_change(x,96);%假设打印机为96dpi,调整图像大小%半色调转换-----------------------------------------------qim=x/uint8(27);%从256灰度级别量化成10灰度级别[ry,cy]=size(x);%构造点模式近似表示10个灰度级halfto(:,:,1)=zeros(3,3);halfto(:,:,2)=[0 255 0;0 0 0;0 0 0];halfto(:,:,3)=[0 255 0;0 0 0;0 0 255];halfto(:,:,4)=[255 255 0;0 0 0;0 0 255];halfto(:,:,5)=[255 255 0;0 0 0;255 0 255];halfto(:,:,6)=[255 255 255;0 0 0;255 0 255];halfto(:,:,7)=[255 255 255;0 0 255;255 0 255];halfto(:,:,8)=[255 255 255;0 0 255;255 255 255];halfto(:,:,9)=[255 255 255;255 0 255;255 255 255];halfto(:,:,10)=[255 255 255;255 255 255;255 255 255];%对于图像中的每个点进行替换,拼接y=[];for (i=1:ry)    z=[];    for (j=1:cy)        case_m=qim(i,j);        z=[z halfto(:,:,case_m+1)];    end    y=[y;z];endy=uint8(y);imwrite(y,'半色调图像.jpg');subplot(1,2,2),imshow(y);title('半色调图像');%figure,imshow(y)%便于打印再次调整图像大小%yy=size_change(y,96);%imwrite(yy,'半色调报告中使用图像.jpg');%figure, imshow(yy)end%生成一个尺寸为256*256大小的渐变测试灰度图像------------------function y=gradi_img()s=256;y=[];for (i=1:s)    y=[y (i-1)*ones(s,1)];endy=uint8(y);imwrite(y,'渐变图像.jpg');figure,imshow(y)end%根据dpi确定A4(216*279mm)像素范围,并进行图像大小调整-------function y=size_change(x,dpi)rsize=216/25.4*dpi/3;csize=279/25.4*dpi/3;%毫米转英寸后进行运算,考虑到半色调变换后行列均增加三倍所以除3[r,c]=size(x);y=x;rscale=r/round(rsize);cscale=c/round(csize);scale=max(rscale,cscale);if(scale>1)    y=imresize(x,1.0/scale);%调整图像大小    imwrite(y,'调整大小后.jpg');endreturn;function y=gradi_img()%生成一个尺寸为256*256大小的渐变测试灰度图像s=256;y=[];for (i=1:s)    y=[y (i-1)*ones(s,1)];endy=uint8(y);imwrite(y,'渐变图像.jpg');figure,imshow(y)end%根据dpi确定A4(216*279mm)像素范围,并进行图像大小调整function y=size_change(x,dpi)rsize=216/25.4*dpi/3;csize=279/25.4*dpi/3;%毫米转英寸后进行运算,考虑到半色调变换后行列均增加三倍所以除3[r,c]=size(x);y=x;rscale=r/round(rsize);cscale=c/round(csize);scale=max(rscale,cscale);if(scale>1)    y=imresize(x,1.0/scale);%调整图像大小    imwrite(y,'调整大小后.jpg');endreturn;
阅读全文
1 0
原创粉丝点击