Image Printing Program Based on Halftoning

来源:互联网 发布:淘宝直通车步骤 编辑:程序博客网 时间:2024/06/06 03:33

最近想把以前上数字图像处理课的课程实验整理一下,因为这些作业以前做的时候或多或少参考了网上别人的文章,时间过去有点久了我记性又不好,所以不记得参考的文章或网站是什么了,如果不小心侵权请私信告知我,我会删掉的。

摘要:该实验使用半色调技术对图像进行打印并显示。在本实验中,用点模式近似表示10个灰度级,每一个灰度级用一个3*3的点模式表示。用黑点全部填充的3*3近似表示灰度级为0的黑色灰度级,全部填充白点的3*3模式近似表示灰度级为9的白色灰度级,其他的点模式表示这二者之间的灰度级。使用这种基于点模式的灰度级图像打印方案打印图像,使得输入图像的每一个像素将对应于打印图像的3*3个像素,图像在水平及垂直方向上的空间分辨率减少为原始图像的33%。实验中利用的这种半色调技术对给定的图像进行打印、分析,并检验等偏爱曲线。同时设计一个大小渐变的测试图像的程序来检验所设计的半色调技术打印方案。利用这种方案进行图像的打印时将减小图像的空间分辨率,将有所增加其几何面积,以防当原始图像过大时输出图像超出A4纸 (21.6*27.9cm) 的打印区域。

技术讨论:

本次试验探讨的是半色调打印技术,将灰度映射成3*3的点阵,256个灰度级别需要量化成10个点模式,每一个灰度级用一个3*3的点模式表示。用黑点全部填充的3*3近似表示灰度级为0的黑色灰度级,全部填充白点的3*3模式近似表示灰度级为9的白色灰度级,其他的点模式表示这二者之间的灰度级。其对应关系如下:


其中grayi,j为图像在(i, j)处的灰度级别,doti,j为量化后的灰度级别,即对应的点阵。10个点阵分别如图2.1所示:


实验结果讨论:

1、测试半色调技术打印

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


2、验证等偏爱曲线的结论

等偏爱曲线的结论:对于有大量细节的图像,可能只需很少的灰度级别来表示。

采用半色调打印技术对数字图像处理第三版图2.22(a)到(c)的三幅图像进行打印,得到对比结果如图3.2所示:



从图3.2的对比结果中可以看出, (a1)图具有少量细节,(c1)图具有大量细节,但结果(c1)与(c2)两幅图像更为接近。本实验将灰度级别为256级的灰度级图像量化成灰度级仅10级的图像。从图3.2中,(a1)与(a2)、(b1)与(b2)、(c1)与(c2)的比较可以得出,等偏爱曲线的结论是成立的,即对具有大量细节的图像只需要较少的灰度级就可以很好的表示。


以上观点仅代表个人实验结果。最后附上本次实验的MATLAB代码:
function y =halftoning(x)%  x 是输入图像矩阵 y是输出图像矩阵[r, c] = size(x);%获取行与列%图像比例超出8.5*11英寸时,通过下采样降低空间分辨率pixelsPerInch = 96;widthMaxPixels = 8.5*pixelsPerInch;heightMinPixels = 11*pixelsPerInch;rScale = double(r)/widthMaxPixels;cScale = double(c)/heightMinPixels;scale = rScale;if (scale < cScale)scale = cScale;endif (scale > 1)downsampling_ave(x, fix(scale));end%从256灰度级别量化成10灰度级别dimg = fix(double(x)/25.6);y = zeros(r*3, c*3);%构造点阵dot_pat = zeros(3, 3, 10);dot_pat(1:3,1:3,1:5) = zeros(3, 3, 5);dot_pat(1,2,2:5) = 255*ones(1,1,4);dot_pat(3,3,3:5) = 255*ones(1,1,3);dot_pat(1,1,4:5) = 255*ones(1,1,2);dot_pat(3,1,5) = 255;dot_pat(1:3,1:3,6:10) = 255*ones(3, 3, 5);dot_pat(2,2,6:9) = zeros(1,1,4);dot_pat(2,1,6:8) = zeros(1,1,3);dot_pat(3,2,6:7) = zeros(1,1,2);dot_pat(2,3,6) = 0;%对于图像的每个点进行点阵映射for (i=1:r)for (j=1:c)level = dimg(i, j);y((i-1)*3+1:i*3, (j-1)*3+1:j*3) = dot_pat(1:3, 1:3, level+1);endendy=uint8(y);endfunction y = test_img()s = 256;y = zeros(s, s);for i = 1 : sy(:,i) = (i-1)*ones(1, s);    end     y = uint8(y);imwrite(y, 'ganeral_img.bmp');endfunction y =downsampling_ave(x,scale)    [r, c] = size(x);if (mod(r, scale) ~= 0 || mod(c, scale) ~= 0)error('The param scale must be a integer that can be divisible by both of img''s row and col');  endnew_r = r/scale;new_c = c/scale;s = scale;y = zeros(new_r, new_c);for (i = 1 : new_r)for(j = 1 : new_c)win = x((i*s-s+1):(i*s), (j*s-s+1):(j*s));y(i, j) = floor(sum(sum(win))/s^2);endendy = uint8(y);imwrite(y, ['lena_downsampling_ave_', num2str(new_r), '_', num2str(new_c), '.bmp']);end


0 0
原创粉丝点击