C语言实现BMP图像处理(半影调技术)

由二值图象显示出灰度效果的方法,就是我们今天要讲的半影调(halftone)技术,它的一个主要用途就是在只有二值输出的打印机上打印图象,实现方法:图案法和抖动法。

图案法(patterning)是指灰度可以用一定比例的黑白点组成的区域表示,从而达到整体图象的灰度感。黑白点的位置选择称为图案化。

计算机显示器,打印机,扫描仪等设备的一个重要指标就是分辨率,单位是 dpi(dot per inch),即每英寸点数,点数越多,分辨率就越高,图象就越清晰。假设有一幅 240×180×8bit 的灰度图,当用分辨率为 300dpi×300dpi 的激光打印机将其打印到12.8×9.6 英寸的纸上时,每个象素的图案有多大?这道题很简单,这张纸最多可以打(300×12.8) ×(300×9.6)=3840×2880 个点,所以每个象
素可以用(3840/240)×(2880/180)=16×16 个点大小的图案来表示,即一个象素 256 个点。如果这 16×16 的方块中一个黑点也没有,就可以表示灰度 256;有一个黑点,就表示灰度255;依次类推,当都是黑点时,表示灰度 0。这样,16×16 的方块可以表示 257 级灰度,比要求的 8bit 共 256 级灰度还多了一个。所以上面的那幅图的灰度级别完全能够打印出来。

这里有一个图案构成的问题,即黑点打在哪里?比如说,只有一个黑点时,我们可以打在正中央,也可以打 16×16 的左上角。图案可以是规则的,也可以是不规则的。一般情况下,有规则的图案比随即图案能够避免点的丛集,但有时会导致图象中有明显的线条。

                                                       

如果想存储 256 级灰度的图案,就需要 256×16×16 的二值点阵,占用的空间还是相当可观的。有一个更好的办法是:只存储一个整数矩阵,称为标准图案,其中的每个值从 0 到255。图象的实际灰度和阵列中的每个值比较,当该值大于等于灰度时,对应点打一黑点。下面举一个 25 级灰度的例子加以说明。

                                                                 

图 4.4 中,左边为标准图案,右边为灰度为 15 的图案,共有 10 个黑点,15 个白点。其实道理很简单,灰度为 0 时全是黑点,灰度每增加 1,减少一个黑点。要注意的是,5×5 的图案可以表示 26 种灰度,当灰度是 25 才是全白点,而不是灰度为 24 时。

标准图案算法:

先 以 一 个 2 × 2 的 矩 阵 开 始 : 设 M 1 = , 通 过 递 归 关 系 有 M n+1 =,其中M n 和U n 均为 2 n ×2 n 的方阵,U n 的所有元素都是 1。根据这个算法,可以得到M 2 = ,为 16 级灰度的标准图案。M 3 (8×8 阵)比较特殊,称为Bayer抖动表。M 4 是一个 16×16 的矩阵。

根据上面的算法,如果利用M 3 一个象素要用 8×8 的图案表示,则一幅N×N的图将变成 8N×8N大小。如果利用M 4 ,就更不得了,变成 16N×16N了。能不能在保持原图大小的情况下利用图案化技术呢?一种很自然的想法是:如果用M 2 阵,则将原图中每 8×8 个点中取一点,即重新采样,然后再应用图案化技术,就能够保持原图大小。实际上,这种方法并不可行。首先,你不知道这 8×8 个点中找哪一点比较合适,另外,8×8 的间隔实在太大了,生成的图象和原图肯定相差很大,就象图 4.1 最右边的那幅图一样。

 

本文附上代码及实验结果,后面补上。

后续持续更新用C语言实现图像处理算法,敬请期待,欢迎关注。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值