首先,我们来看这么一个问题:
黑白针式打印机只能打印黑白两种颜色,它是怎么打印出灰色图像的呢??
回答这个问题,我们要先了解下黑白打印机的工作原理:针式黑白打印机是靠撞针击打色带来打印黑点的。
我们仔细观察打印出的灰色图像就可以看出,这些灰色区域都是一些黑点组组成的,图像暗的地方黑点就多一些,图像亮的地方黑点相对少一些。
半影调技术就是如何利用二值黑白打印机打印灰色图像的一们技术。
下面介绍具体实现半影调技术的一种方法:图案法
图案法是指灰度可以用一定比例的黑白点组成的区域表示,从而达到整体图像的灰度感。
黑白点的位置选择称为图案化。
计算机显示器、打印机、扫描仪等视频输出设备的一个重要指标就是分辨率,单位是dpi(dot perinch),
即每英寸点数。每英寸上的点数越多,分辨率就越高,图像就越清晰。
假设打印的时候,有一幅160×120×8bit 的灰度图,要用分辨率为200dpi×200dpi 的激光打印机将其打印到12.8×9.6 英寸的纸上。
由于这张纸最多可以打(200×12.8)×(200×9.6)=2560×1920 个点, 所以每个像素可以用(2560×1960)/(160×160)=256
个点大小的图案来表示,即一个像素可以有16×16=256 个点。如果这16×16 的方块中一个黑点也没有,就可以表示灰度256;
有一个黑点,就表示灰度255;依次类推,当都是黑点时,表示灰度0。这样,16×16 的方块可以表示257 级灰度,比要求的8bit
共256 级灰度还多了一个。所以上面那幅图的灰度级别完全能够打印出来。
如下图所示即是一个用2×2 图案来表示5 级灰度的例子。
表示的时候有图案构成的问题,即黑点打在哪里?例如,只有一个黑点时,我们可以打在正中央,
也可以打16×16 的左上角。所以最后用来表示灰度的图案可以是规则的,也可以是不规则的。一般来说,
有规则的图案比随机图案能够避免点的丛集,但有时会导致图像中有明显的线条。
假设使用16×16 个二值点来打印一个灰度像素,如果想存储256 级灰度的图案的标准模板,就需要
256×16×16 的二值点阵,占用的空间还是相当可观的。一个更好的办法是:只存储一个16×16 整数矩阵,
称为标准图案,矩阵元素的取值从0 到255。像素的实际灰度和阵列中的每个值比较,当该值大于等于
灰度时,标准图案中标号大于或等于灰度值的对应点打一黑点。
下面介绍一种由Limb 在1969 年提出的设计标准图案的算法。先以一个2×2 的矩阵开始
M2 为16 级灰度的标准图案,如果一个16 级灰度图像的对应像素值为11 的话,M2 所有大于11 的
对应点都要打印为黑色。M3(8×8 阵)比较特殊,称为Bayer 抖动表。M4 是一个16×16 的矩阵。
根据上面的算法,如果利用M3,则一个像素要用8×8 的图案表示,一幅N×N 的图将变成8N×8N
大小。如果利用M4,变成16N×16N 了,也就是在相同分辨率的情况下,打印出来的图像是真实图像的
256 倍大小。如果要在保持原图大小的情况下利用图案化技术,则只需要在像素所对应的图案中取一点,
即重新采样,然后再应用图案化技术,就能够保持原图大小。对于M3 阵来说,即在原图中每8×8 个点
中取一点。但是实际上,这种方法并不可行。因为实际不知道这8×8 个点中找哪一点比较合适,而且8×8
的间隔实在太大了,生成的图像和原图肯定相差很大。
采用如下的算法可以部分避免上面的问题。
假设原图是256 级灰度,利用Bayer 抖动表,做如下处理:
x,y 代表原图的像素坐标,p[y][x]代表该点灰度。在显示的时候首先将灰度右移两位,变成64 级,
然后将x,y 做模8 运算,找到Bayer 表中的对应点,两者做比较,判断当前的像素输出为黑色还是白色。
可以看到,模8 运算使得原图分成了一个个8×8 的小块,每个小块和8×8 的Bayer 表相对应。小块
中的每个点都参与了比较,这样就避免了上面提到的选点和块划分过大的问题。模8 运算实质上是引入
了随机成分。
if (p[y][x]>>2) > bayer[y&7][x&7]
then 显示白点
else 显示黑点
可以看到,模8 运算使得原图分成了一个个8×8 的小块,每个小块和8×8 的Bayer 表相对应。小块
中的每个点都参与了比较,这样就避免了上面提到的选点和块划分过大的问题。模8 运算实质上是引入
了随机成分。