机器视觉 增强现实分享 http://blog.sciencenet.cn/u/wanglin193

博文

只用黑白点,如何表示图像

已有 11918 次阅读 2010-8-26 19:02 |个人分类:备忘|系统分类:科研笔记| halftoning, dithering


我们对一个图像进行二值化处理,原始图像见题图左上角,图像来自网络

一 灰度图像二值化
对图像矩阵的每个点做阈值处理,matlab代码如下

th=127;
imgout = img>th;

处理结果如下:


如果阈值th取0~255间的随机数:
imgout = img>255*rand(size(img));
结果如下:

 

以上方法对图像像素做单独考虑,通常叫做点操作(point operation)。


二 使用Floyd-Steinberg算法
这种方法把每个点量化(这里就是二值化)后产生的误差向它的邻域传播。具体操作是,当处理到(x,y)这个点时,把它量化后的误差,按照固定比例加到它的右下方4个邻域点(x+1,y),(x+1,y+1),(x,y+1),(x-1,y+1)上。通常把邻域描述成这样一个模板矩阵,它表示点*对准图像的(x,y)位置时,误差分配的比例:

[ -, * ,7;
 3 ,5, 1] /16


如果考虑更大的邻域这个矩阵变成:
[ -, - , *, 7, 5;
 3, 5, 7, 5, 3;
 1, 3, 5, 3, 1] /48

算法用附件提供的函数实现:
imgout = FS(img);

结果见题图右上角。从结果可以看出,颜色暗的地方点分布的密些,亮的地方点分布得稀疏些。这种只用黑点和白点来表达图像灰度的方法叫做Halftoning。我还记得小时候,出现在报纸上的插图都是以这种方式印刷的,图像的颜色的深浅是用油墨点的大小和密集程度来表示的。这种误差传播(error diffusion)的方法也用在图像的压缩上,比如24Bit的彩色图像量化成8Bit 256色图像时,用它可以消除简单量化导致的讨厌的等高线现象,就需要这种称为dithering的方法,halftoning可看作量化成2bit的极端情形。

如果更近一步,考虑到图像边缘是很重要的信息,我们不希望图像中大面积的黑色区域浪费太多的油墨,那么可以通过加强边缘并降低连续区域重要性的方法来实现。最简单地我们对边缘强度图(题图左下)做halftoning,结果如题图右下所示。在这个梯度的Halftoning图像上,如果用类似画笔的笔触代替这些黑点,那么就可以绘出类似素描或者油画风格的图,这个应用叫做Non-photorealistic rendering,简称NPR,它是以追求真实图像的艺术化效果为目的。

可以看出这种同时考虑到邻域的方法,比起只考虑单个像素点的点操作来说,要好很多。这是因为人眼感觉的关系,我们对图像区域的感觉更强烈。在图像处理领域,这种同时考虑当前点和邻域点的处理方法很常见。实际上,现实中的图像可以都可以看作马尔可夫随机场(MRF),每个像素点的属性都和它附近区域的点有关。可以说MRF是现代图像处理最根本的数学模型,很多应用都和它有关。有点扯远了,今天就到这里吧。



参考文献:

[1] 维基百科 http://en.wikipedia.org/wiki/Dither


附件:
Floyd-Steinberg halftone matlab code

 



https://blog.sciencenet.cn/blog-465130-356542.html

上一篇:数码相机中的人脸检测
下一篇:摄像机标定(Camera calibration)笔记
收藏 IP: 58.247.12.*| 热度|

1 杨华磊

发表评论 评论 (2 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-12-25 16:37

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部