数字图像处理入门—直方图修正和彩色变换

  • 格式:pdf
  • 大小:135.12 KB
  • 文档页数:9

数字图像处理入门—直方图修正和彩色变换这次,我们主要和调色板打交道。

先从最简单的反色讲起。

1. 反色(invert)反色就是形成底片效果。

如下图所示,图2为图1反色后的结果图1. 原图图2. 图1反色后的结果反色有时是很有用的,比如说,图1中黑色区域占绝大多数,这样打印起来很费墨,我们可以先进行反色处理再打印。

反色的实际含义是将R,G,B值反转。

若颜色的量化级别是256,则新图的R,G,B值为255减去原图的R,G,B值。

这里针对的是所有图,包括真彩图,带调色板的彩色图(又称为伪彩色图),和灰度图。

针对不同种类有不同的处理。

先看看真彩图。

我们知道真彩图不带调色板,每个像素用3个字节,表示R,G,B三个分量。

所以处理很简单,把反转后的R,G,B值写入新图即可。

再来看看带调色板的彩色图,我们知道位图中的数据只是对应调色板中的一个索引值,我们只需要将调色板中的颜色反转,形成新调色板,而位图数据不用动,就能够实现反转。

灰度图是一种特殊的伪彩色图,只不过调色板中的R,G,B值都是一样的而已。

所以反转的处理和上面讲的一样。

这里,我想澄清一个概念。

过去我们讲二值图时,一直都说成黑白图。

二值位图一定是黑白的吗?答案是不一定。

我们安装Windows95时看到的那幅setup.bmp是由蓝色和黑色组成的,但它实际上是二值图。

原来,它的调色板中的两种颜色是黑与蓝,而不是黑与白。

所以说二值图也可以是彩色的,只不过一般情况下是黑白图而已。

实现反色的源程序2. 彩色图转灰度图(color to grayscale)我们在第二讲时提到了YUV的颜色表示方法,知道在这种表示方法中,Y分量的物理含义就是亮度,它含了灰度图的所有信息,只用Y分量就完全能够表示出一幅灰度图来。

YUV和RGB之间有着如下的对应关系。

我们利用上式,根据R,G,B的值求出Y值后,将R,G,B值都赋值成Y,就能表示出灰度图来,这就是彩色图转灰度图的原理。

先看看真彩图。

我们知道真彩图不带调色板,每个像素用3个字节,表示R,G,B三个分量。

所以处理很简单,根据R,G,B的值求出Y值后,将R,G,B值都赋值成Y,写入新图即可。

再来看看带调色板的彩色图,我们知道位图中的数据只是对应调色板中的一个索引值,我们只需要将调色板中的彩色变成灰度,形成新调色板,而位图数据不用动,就可以了。

彩色图到灰度图的转换的源程序3. 真彩图转256色图(true color to 256 indexed color)我们知道,真彩图中包含最多达2的24次方种颜色,怎样从中选出256种颜色,又要使颜色的失真比较小,这是一个比较复杂的问题。

一种简单的做法是将R:G:B以3:3:2表示,即取R,G的高3位,B的高两位,组成一个字节,这样就可以表示256种颜色了,但不难想象,这种方法的失真肯定很严重。

我们下面介绍的算法能够比较好的实现真彩到256色的转换。

它的思想是:准备一个长度为4096的数组,代表4096种颜色。

对图中的每一个像素,取R,G,B的最高四位,拼成一个12位的整数,对应的数组元素加1。

全部统计完后,就得到了这4096种颜色的使用频率。

这其中,可能有一些颜色一次也没用到,即对应的数组元素为零(假设不为零的数组元素共有PalCounts 个)。

将这些为零的数组元素清除出去,使得前PalCounts个元素都不为零。

将这PalCounts个数按从大到小的顺序排列(这里我们使用起泡排序),这样,前256种颜色就是用的最多的颜色,它们将作为调色板上的256种颜色。

对于剩下的PalCounts-256种颜色并不是简单的丢弃,而是用前256种颜色中的一种来代替,代替的原则是找有最小平方误差的那个。

再次对图中的每一个像素,取R,G,B的最高四位,拼成一个12位的整数,如果对应值在前256种颜色中,则直接将该索引值填入位图数据中,如果是在后PalCounts-256种颜色中,则用代替色的索引值填入位图数据中。

下面的两幅图,图3是原真彩图,图4是用上面的算法转成的256色图,可以看出,效果还不错。

图3. 原真彩图 图4. 转换后的256色图真彩图转256色图算法的源程序。

以下我们将要介绍灰度变换,针对的都是256级灰度图。

4.对比度扩展(contrast stretching)假设有一幅图,由于成象时光照不足,使得整幅图偏暗,(例如,灰度范围从0到63);或者成象时光照过强,使得整幅图偏亮,(例如,灰度范围从200到255),我们称这些情况为低对比度,即灰度都挤在一起,没有拉开。

灰度扩展的意思就是把你所感兴趣的灰度范围拉开,使得该范围内的像素,亮的越亮,暗的越暗,从而达到了增强对比度的目的。

我们可以用如下的图来说明对比度扩展的原理。

图5. 对比度扩展的原理图中的横坐标gold表示原图的灰度值,纵坐标gnew表示gold经过对比度扩展后得到了新的灰度值。

a,b,c 为三段直线的斜率,因为是对比度扩展,所以斜率b>1。

g1old和g2old表示原图中要进行对比度扩展的范围,g1new和g2new表示对应的新值。

用公式表示为 a*gold 当0<=gold<g1old时 -g1old)+g1new 当g1old<=gold<g2old时gnew=b*(gold c*(gold-g2old)+g2new 当g2old<gold<=255时显然要得到对比度扩展后的灰度,我们需要知道a,b,c,g1old,g2old五个参数。

由于有新图的灰度级别也是255这个约束,所以满足a*g1old+b*(g2old-g1old)+c(255-g2old)=255这个方程。

这样,我们只需给出四个参数,而另一个可以可以代入方程求得。

我们假设a=c,这样,我们只要给出b,g1old和g2old,就可以求出:a=(255-b*(g2old-g1old))/(255-(g2old-g1old))要注意的是,给出的三个参数必须满足1. b*(g2old-g1old)<=255;2. (g2old-g1old)<=255这两点是显然的。

下图为图1取g1old=100;g2old=150 ;b=3.0进行对比度扩展的结果。

可以看出亮的区域(雕塑)变得更亮,暗的区域(手)变得更暗。

图6. 图1对比度扩展后的结果实现对比度扩展的源程序。

5.削波(cliping)削波可以看作是对比度扩展的一个特例,我们用如下的图说明削波的原理。

图7. 削波的原理不难看出,只要令对比度扩展中的a=c=0就实现了削波。

我们只要给出范围的两个端点,斜率b就可以用方程b*(g2old-g1old)=255求出。

下图为图1取g1old=150;g2old=200 进行削波的结果。

把亮的区域(雕塑)提取了出来。

图8. 图1削波处理后的结果削波的程序和对比度扩展的程序很类似,就不再给出了。

6.阈值化(thresholding)阈值化可以看作是削波的一个特例,我们用如下的图说明阈值化的原理。

图9. 阈值化的原理不难看出,只要令削波中的g1old=g2old就实现了阈值化。

阈值就象个门槛,比它大就是白,比它小就是黑。

经过阈值化处理后的图象变成了黑白二值图,所以说阈值化是灰度图转二值图的一种常用方法(我们以前介绍过图案化和抖动的方法)。

阈值化只需给出阈值点,即g1old即可。

下图为图1阈值取128,阈值化处理后的结果,得到了一幅黑白图。

图10. 图1阈值化处理后的结果阈值化的程序和对比度扩展的程序很类似,就不再给出了。

7.灰度窗口变换(slicing)灰度窗口变换是将某一区间的灰度级和其它部分(背景)分开。

我们用如下的图说明灰度窗口变换的原理。

其中[g1old,g2old]称为灰度窗口。

图11. 清除背景的灰度窗口变换的原理图12. 保留背景的灰度窗口变换的原理灰度窗口变换有两种,一种是清除背景的,一种是保留背景的。

前者把不在灰度窗口范围内的像素都赋值为0,在灰度窗口范围内的像素都赋值为255,这也能实现灰度图的二值化;后者是把不在灰度窗口范围内的像素保留原灰度值,在灰度窗口范围内的像素都赋值为255。

灰度窗口变换可以检测出在某一灰度窗口范围内的所有像素,是图象灰度分析中的一个有力工具。

下面有三幅图,图13为原图,图14是经过清除背景的灰度窗口变换处理后的图(灰度窗口取[200-255]),将夜景中大厦里的灯光提取了出来。

图15是经过保留背景的灰度窗口变换处理后的图(灰度窗口取[200-255]),将夜景中大厦里的灯光提取了出来,同时保留了大厦的背景,可以看出它们的差别还是很明显的。

图13. 原图 图14. 图13经过清除背景 图15. 图13经过保留背景的 的灰度窗口变换处理后的图 灰度窗口变换处理后的图灰度窗口变换的程序和对比度扩展的程序很类似,就不再给出了。

我突然想起了不久前在一本科学杂志上看到的一篇文章,非常有趣,是介绍电影〈阿甘正传〉特技制作的。

其中有一项就用到了类似灰度窗口变换的思想。

相信看过这部电影的读者都会对那个断腿的丹尼上校有深刻的印象。

他的断腿是怎么拍出来的呢?其实方法很简单,先拍一幅没有演员出现的背景画面,然后拍一幅有演员出现,其它不变的画面。

要注意的是,此时演员的腿用蓝布包裹。

把前后两幅图输入计算机进行处理。

第二幅图中凡是遇到蓝色的像素,就用第一幅图中对应位置的背景像素代替。

这样,一位断腿的上校就逼真的出现在屏幕上了。

这就是电影特技中经常用到的"蓝幕"技术。

说点题外话,其实现代电影,特别是好莱坞的电影,越来越离不开计算机及图象处理技术。

引起轰动的大片中的很多特技镜头就是利用了庞大的SGI图形工作站机群没日没夜的计算产生的。

图象处理技术和我们所喜爱的电影艺术紧密的结合了起来,这更增加了我们学习它的兴趣。

8.灰度直方图统计(histogram)有时我们需要知道一幅图中的灰度分布情况,这时就可以采用灰度直方图来表示,图中的横坐标表示灰度值,纵坐标表示该灰度值出现的次数(频率)。

图16为图13的灰度直方图,可见,低灰度的像素占了绝大部分。

图16. 图13的灰度直方图显示一幅图的灰度直方图的程序。

9.灰度直方图均衡化(histogram equalization)在介绍灰度直方图均衡化之前,先讲讲直方图修正。

所谓直方图修正,就是通过一个灰度映射函数Gnew=F(Gold),将原灰度直方图改造成你所希望的直方图。

所以,直方图修正的关键就是灰度映射函数。

我们刚才介绍的阈值化,削波,灰度窗口变换等等,都是灰度映射函数。

直方图均衡化是一种最常用的直方图修正。

它是把给定图象的直方图分布改造成均匀直方图分布。

由信息学的理论来解释,具有最大熵(信息量)的图象为均衡化图象。

直观地讲,直方图均衡化导致图象的对比度增加。