Image Printing Program Based on Halftoning

摘  要: 本实验采用一种基于点模式的灰度级打印方案—半色调技术对图像进行尺度、灰度的调整、显示和打印,实验用3*3的黑白点模式来表示每一个灰度级,用黑点全部填充的 3 * 3 区域近似表示灰度级为0的黑色灰度级,全部填充白点的 3*3 模式近似表示灰度级为9 的白色灰度级,其它的点模式表示这二者之间的灰度级。即输入图像中的每一个像素将对应于打印图像中的3*3个像素, 这样在水平和垂直方向上的空间分辨率将减少为原始图像的 33%。因此为了防止输入图像尺寸过大而使程序打印出来的图像超出A4纸的打印区域,需要编写一个调整原始图像尺寸大小的程序,并写一个生成尺寸为 256*256 大小的渐变测试图像的程序,最后对几幅图像的进行处理来验证半色调技术。


1、实验目的

(a)、 编写一个使用上述点模式的半色调技术打印灰度图像的程序。要求程序可以对输入图像的尺度(尺寸)进行调整,以便使打印图像不超出 A4 纸(21.6 x 27.9 cm)的打印区域;要求程序在打印输出以前将输入图像的灰度级范围变换到半色调的整个灰度范围。

(b)、编写一个生成尺寸为 256*256 大小的渐变测试图像的程序。输出图像第 1 列像素灰度为 0,第 2 列像素灰度为 1,以此类推,最后 1 列像素灰度为 255。使用(a)中编写的灰度图像打印程序打印该图。

(c)、 使用(a)中编写的灰度图像打印程序打印课本图 2.22(a)到(c)。打印结果是否符合课本图 2.23 给出的结论并给出解释。

技术论述

半色调技术是指用少量的色彩将一幅连续色调图像(如灰度图像和彩色图像)量化为一幅二值图像或是只有少数几种色彩的彩色图像,并且量化后图像在一定距离的视觉效果和原始图像相似的技术。众所周知,数字半色调技术是指基于人眼视觉特性和图像呈色特性,利用数学、计算机等工具,在单色/多色二值呈色设备上实现图像的最优再现的一门技术。数字半色调是利用人眼的低通特性,当在一定距离下观察时,人眼将图像中空间上接近的部分视为一个整体。利用此特性,人眼观察到的半色调图像局部平均灰度近似于原始图像的局部平均灰度值,从而整体上形成连续色调的效果。它的发展共经历了三个阶段:照相加网(即模拟加网)、电子加网和计算机数字加网三个发展阶段。

采用 MATLAB 编程环境写 M 函数去完成实验,MATLAB是一种用于算法开发、数据可视化数据分析以及数值计算的高级技术计算语言和交互式环境。它主要提供以下功能:用于技术计算的高级语言;可对代码、文件和数据进行管理的开发环境;可以按迭代的方式探查、设计及求解问题的交互式工具;可用于线性代数、统计、傅立叶分析、筛选、优化以及数值积分等的数学函数;可用于可视化数据的二维和三维图形函数;可用于构建自定义的图形用户界面的各种工具;可将基于MATLAB的算法与外部应用程序和语言集成的各种函数等。在本实验中我们主要运用了MATLAB扩展的图像处理工具箱进行(如利用函数imread、imshow和imresize可以实现对图像的读取、显示和调整)。

 

实验过程与分析

1、本实验给出了用点模式近似表示的 10 个灰度级的图像,每一个3 * 3 的黑白点模式表示一个灰度级,用3*3全黑点近似表示灰度级为0的黑色灰度级,3*3全白点近似表示灰度级为9的白色灰度级。通过半色调技术进行图像的显示和打印。根据实验要求可以构建一个三位矩阵来表示10个灰度级,再将图像中的每一个点映射到点阵中,把数据类型转换为unit8就可以生成半色调打印技术的程序。

2、因为要用3*3的像素点代替原来的一个像素点,因此在水平和垂直方向上的空间分辨率将减少为原始图像的 33%,也就是输入图像的尺寸大小可能变为原图像的三倍,所以要对输入图像的大小进行预处理,调整它的尺寸大小,在这里可以调用函数imresize()去缩小图像尺寸大小。采用B = imresize(A, scale)的格式缩小图像,表示图像B的长宽是图像A的长宽的scale倍。若scale大于1,则放大图像;若scale小于1则缩小图像,scale的取值范围为0到10之间。

3、在MATLAB中构造一个256*256大小的矩阵,用for循环语句对每列元素从0到255进行赋值,通过imshow()和imwrite()函数显示输出图像并把输出图像写入当前目录中。

实验结果讨论

由渐变测试灰度图像程序生成的256*256 大小渐变测试灰度图像如图1-1(a)所示,经过半色调打印技术输出的渐变灰度图像如图1-1(b)所示。实验目的(c)要求使用(a)中编写的灰度图像打印程序打印课本图2.22(a)到(c),经过尺寸调整和半色调打印技术后的图像如下图2-1(a)、2-1(b)、2-2(a)、2-2(b)、2-3(c)、2-3(c)所示。经过对比可知输入图像2.22(a)和2.22(c)的尺寸均大于256*256,需要经过图像尺度调整,最后输出图像的尺寸为816*816。输入图像2-22(c)的尺寸不大于256*256,不需要经过图像尺度调整,最后输出图像尺寸为768*768。


 

图1-1(a) 渐变测试灰度图像

图1-1(b) 半色调打印技术输出的渐变灰度图像

 

 

图2-1(a) 经尺寸调整的2.22(a)图像

图2-1(b) 半色调打印技术处理后的2.22(a)图像

图2-2(a) 经尺寸调整的2.22(b)图像

图2-2(b) 半色调打印技术处理后的2.22(b)图像

图2-3(a) 经尺寸调整的2.22(c)图像

图2-3(b) 半色调打印技术处理后的2.22(c)图像

附录:程序清单

1、半色调打印技术的图像处理程序

function y=halfton(x)

%半色调图像打印技术程序

%将图像读入MATLAB环境

%读取图像大小

x=imread('Fig2.22(a).jpg');

IN=1; OUT=2;

[r,c]=size(x);

rscale=double(r)/272;

cscale=double(c)/352;

scale=max(rscale,cscale);

%判断输入图像尺寸是否超过272*352,若超过进行调整

if(scale>1)

   x=imresize(x,1.0/scale);

   x=uint8(x);

   subplot(IN,OUT,1);

   imshow(x);

   title('调整输入图像适合在A4纸上打印');

   imwrite(x,'adjustment.jpg');

end

%把图像的256个灰度级别量化成10个灰度级

[ry,cy]=size(x);

imq=fix(double(x)/25.6);%imq是经过量化的图像

y=zeros(ry*3,cy*3);

%根据实验要求构造近似10个灰度级的点模式

mat(:,:,1)=zeros(3,3);

mat(:,:,2)=[0 1 0;0 0 0;0 0 0]*225;

mat(:,:,3)=[0 1 0;0 0 0;0 0 1]*225;

mat(:,:,4)=[1 1 0;0 0 0;0 0 1]*225;

mat(:,:,5)=[1 1 0;0 0 0;1 0 1]*225;

mat(:,:,6)=[1 1 1;0 0 0;1 0 1]*225;

mat(:,:,7)=[1 1 1;0 0 1;1 0 1]*225;

mat(:,:,8)=[1 1 1;0 0 1;1 1 1]*225;

mat(:,:,9)=[1 1 1;1 0 1;1 1 1]*225;

mat(:,:,10)=[1 1 1;1 1 1;1 1 1]*225;

%对于图像的每个点进行点阵映射

for (i=1:ry)

    for (j=1:cy)

       level=imq(i,j);

       y((i-1)*3+1:i*3,(j-1)*3+1:j*3)=mat(:,:,level+1);

    end

end

   y=uint8(y);

   subplot(IN,OUT,2);

   imshow(y);

   title('半色调技术打印的图像');

   imwrite(y,'halfton.jpg');

end

2、生成渐变测试灰度图像程序

function y=gradient()

%生成一个尺寸为256*256大小的渐变测试灰度图像

s=256;

y=zeros(s,s);

for (i=1:s)

   y(:,i)=(i-1)*ones(1,s);

end

y=uint8(y);

figure,imshow(y);

title('渐变测试灰度图像');

imwrite(y,'gradient.jpg');

end

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Revit 是一种建筑信息模型(BIM)软件,不太了解半色调的融合算法在 Revit 中的应用场景,不过我可以给您提供一个 C++ 的半色调融合算法示例。 半色调融合算法是一种将两幅图像融合在一起的方法,它可以使得融合后的图像既能够保留原始图像的细节信息,又能够获得更好的视觉效果。该算法的基本思路是将两幅图像的灰度值进行平均,然后根据平均灰度值将两幅图像进行分割,并对分割后的图像进行半色调处理。 以下是一个简单的 C++ 实现示例: ```c++ #include <opencv2/opencv.hpp> using namespace cv; void halfToning(Mat& src, Mat& dst) { int threshold = 128; int width = src.cols; int height = src.rows; int x, y; uchar grayValue; for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { grayValue = src.at<uchar>(y, x); if (grayValue > threshold) { dst.at<uchar>(y * 2, x * 2) = 255; dst.at<uchar>(y * 2, x * 2 + 1) = 255; dst.at<uchar>(y * 2 + 1, x * 2) = 255; dst.at<uchar>(y * 2 + 1, x * 2 + 1) = 255; } else { dst.at<uchar>(y * 2, x * 2) = 0; dst.at<uchar>(y * 2, x * 2 + 1) = 0; dst.at<uchar>(y * 2 + 1, x * 2) = 0; dst.at<uchar>(y * 2 + 1, x * 2 + 1) = 0; } } } } int main() { Mat src = imread("input.jpg", IMREAD_GRAYSCALE); Mat dst(src.rows * 2, src.cols * 2, CV_8UC1, Scalar(0)); halfToning(src, dst); imshow("Half Toning", dst); waitKey(0); return 0; } ``` 该示例中,我们使用 OpenCV 库来读取图像并进行半色调处理。`halfToning` 函数中,我们将输入的灰度图像 `src` 进行半色调处理,并将结果保存在输出图像 `dst` 中。在半色调处理中,我们使用一个阈值 `threshold` 来将灰度值进行分割,并根据分割后的结果进行半色调处理。最终,我们展示了处理后的图像并等待用户按下任意键退出程序。 需要注意的是,该示例只是一个简单的示例,实际应用中可能需要更加复杂的算法或者处理逻辑。同时,该示例也没有涉及到 Revit 软件的相关内容,如果您有更加详细的应用场景或者要求,可以提供更加详细的信息,以便我能够更好地回答您的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值