|||
我们对一个图像进行二值化处理,原始图像见题图左上角,图像来自网络。
一 灰度图像二值化
对图像矩阵的每个点做阈值处理,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
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-22 18:07
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社