
1.3 图像处理基础算法
本节主要讲述一些基本的图像算法,它们也是美颜美妆算法研究的必备知识,让初学者能够对图像进行简单的操作,对图像算法有一个初步的认识。
1.3.1 图像灰度化
知识点
对于 24位的 RGB图像而言,每个像素用 3字节表示,分别对应 R、G、B三个分量。如果 R、G、B 三个分量的值不相同,那么表现出来就是彩色图像;如果三者的值相同,那么表现出来就是灰度图像。而一张彩色图像转换为灰度图像,就叫作图像灰度化。
图像灰度化本身没有明确的定义,可以用任何一组参数,让一张图像的 R=G=B=Gray,因此,灰度化算法也就没有明确的规定。现有的灰度化算法一般是根据人眼对颜色的感应情况得出的一些参数公式,这里介绍如下几种:
· 均值灰度化
· 经典灰度化
· Photoshop灰度化
均值灰度化,每个像素的灰度值为 R、G、B 分量的均值,也叫作明度灰度化,与在 HSI颜色空间中计算I的方法相同:

经典灰度化,结合人眼对颜色的感应度,得到的一组比较适合的参数:

Photoshop 灰度化,即 PS 中的“去色”命令,是一种基于最大值和最小值均值的灰度化计算:

以上三种是比较常用的图像灰度化算法。在灰度化计算中,陆续出现了更高级的、可以根据每张图像的信息自动计算最优参数,以保留对比度信息的灰度化算法,如以下几篇论文所示,大家可以自行研究。
Color2Gray:Salience-Preserving Color Removal
Contrast Preserving Decolorization
Real-time Contrast Preserving Decolorization
编程实现
我们使用C语言实现上述三种灰度化算法,代码如下:



下面使用三种灰度化算法进行效果测试,给出灰度化效果图和对应的直方图,如图 1.24所示。

图1.24 灰度化算法测试效果图
本节所有代码工程及DEMO见代码包中1.4.1文件夹中的文件。
1.3.2 图像阈值化
知识点
对图像阈值化最简单的理解就是根据一个特定的阈值 T,将图像分为黑、白两种颜色。对于 24位 RGB图像而言,每个像素用 3字节表示,分别对应 R、G、B三个分量,我们可以计算像素的灰度值。将灰度值和阈值进行比较,得到黑白阈值图。由于结果只有黑、白两个值,因此,阈值化也叫作二值化。
阈值化公式如下:

这里讲的阈值化是固定T的阈值化,在实际应用中,可以根据各种自适应算法来针对不同的图像信息计算出不同的阈值 T,进而实现不错的二值效果,这称为自适应阈值化(自适应二值化)。经典的自适应二值化有:双峰法二值化、P 分位法二值化、Otsu法二值化、一维最大熵法二值化、简单统计二值化和迭代法二值化等。
编程实现
我们使用C语言实现图像阈值化算法,代码如下:

阈值化的效果如图1.25所示。

图1.25 图像阈值化测试效果图
本节所有代码工程及DEMO见代码包中1.4.2文件夹中的文件。
1.3.3 图像直方图
知识点
图像直方图包括灰度直方图和彩色直方图。灰度直方图可以理解为灰度图像的直方图,彩色直方图则是多通道的直方图。以 24位 RGB图像为例,彩色直方图是 R、G、B三个通道的独立直方图,每个通道对应该通道的直方图。
灰度直方图描述的是图像中具有该灰度级的像素的个数,图像的像素值的范围为 0~255,因此灰度级为 0~255,共 256个灰度级。我们以灰度级为横坐标、像素个数为纵坐标构建二维坐标系,一张宽度和高度都为4的灰度图,直方图可以描述为图1.26。

图1.26 灰度直方图
在图1.26中,左图为灰度数字图像,宽度、高度都为4,数字为对应像素的像素值(灰度级);右图为所有像素的个数统计,横坐标表示灰度级,纵坐标表示对应灰度级的像素个数。比如,像素值为 1的像素,个数为 1,右边坐标系中显示纵坐标值为 1,而像素值为 8的像素一共有4个,那么右边坐标系的纵坐标值就显示为4,这就叫作直方图。
如果将灰度直方图理解为一个通道图像的直方图,那么24位的RGB图像就有三张直方图,如图1.27所示。这三张直方图分别描述了对应颜色通道中像素值个数的统计情况。

图1.27 24位RGB图像的彩色直方图
直方图在一定程度上反映了图像像素的分布情况,因此,可以根据直方图来判断一张图像质量的好坏。一张灰度分布均匀的图像,它的直方图一般符合正态分布;过曝的图像,直方图的灰度级分布主要集中在128~255之间;偏暗的图像,直方图的灰度级则主要集中在0~128之间。图1.28展示了几种情况的灰度直方图分布。

图1.28 不同光强照片的直方图分布
编程实现
我们使用C语言实现图像直方图计算,代码如下:


代码的DEMO效果测试图如图1.29所示。

图1.29 直方图DEMO效果测试图
本节所有代码工程及DEMO见代码包中1.4.3文件夹中的文件。
1.3.4 图像的亮度/对比度调整
知识点
亮度 Luminance是表示人眼对发光体或被照射物体表面的发光或反射光强度实际感受的物理量(该定义来自维基百科)。
图像亮度是图像给人眼的一种直观感受。对于一张灰度图而言,灰度值越大,图像就越亮;反之,图像越暗。
我们以PS中的旧版亮度/对比度为例,看一下图像亮度的变化效果,如图1.30所示。

图1.30 图像亮度的变化效果
从图1.30中可以看出,随着亮度值从低变高,图像也由暗变亮,这个过程就是亮度调节过程。
图像对比度是指图像中从黑色到白色渐变的层次反差或比值。反差越大,比值越大,从视觉上感知,图像就越清晰醒目,对比度越大;反差越小,比值越小,从视觉上感知,图像越不清晰醒目,蒙尘感越强,对比度越小。
我们以PS中的旧版亮度/对比度为例,看一下图像对比度的变化效果,如图1.31所示。

图1.31 图像对比度的变化效果
从图 1.31 中可以看出,随着对比度从小变大,图像明暗反差逐渐增加,清晰度也逐渐增强。当对比度小于 0 时,会有灰蒙蒙的感觉,当对比度为-100 时,图像完全变为灰色;当对比度大于 0时,图像较清晰,当对比度为 100时,在 PS中表现为 8种颜色(黑、白、红、黄、绿、青、蓝、紫)。
关于亮度和对比度调节的算法有很多,由于 PS 的特殊性与通用性,这里只介绍 PS 中的旧版亮度/对比度调节算法,其他相关内容大家可以自行搜索相关论文。
PS中亮度/对比度调节算法的计算流程如下所述。
①在RGB颜色空间中,计算宽×高为M×N的图像灰度平均值Average。
灰度化公式:

灰度均值计算:

②亮度/对比度调节。

编程实现
我们使用C语言实现PS中的旧版亮度/对比度算法(算法效果与PS中的完全一样):


本节介绍的算法与PS中的效果对比如图1.31所示。

图1.32 本节算法与PS效果对比

图1.32 本节算法与PS效果对比(续)
本节所有代码工程及DEMO见代码包中1.4.4文件夹中的文件。
1.3.5 图像的饱和度调整
知识点
饱和度(Saturation)是指色彩的鲜艳程度或者纯度。饱和度越高,图像色彩越鲜艳,色彩纯度越高;反之则越低,直至灰度图。
在前面 HSⅤ 颜色空间的介绍中,我们也介绍了饱和度的概念,其中 S 分量即饱和度分量,取值范围为[-100,100]。通过将 RGB颜色空间转换为 HSⅤ颜色空间,即可对饱和度 S进行调整。如图 1.33 所示,在原图的饱和度由低到高的变化过程中,图像的色彩鲜艳程度也逐渐增加,色彩纯度也逐渐增加。

图1.33 图像饱和度调节(左图为原图)
对于饱和度调节算法,可以使用 HSⅤ颜色空间进行调节,当然也可以使用 HSI/HSL等颜色空间。不过,由于颜色空间转换计算复杂,比较耗时,因此,这里给出单一调节饱和度的算法。该算法的效果与PS中饱和度调节的效果一致,基于HSL颜色空间修改获得,算法本身来自网络。
饱和度调节算法的逻辑如下所述。
假设在 RGB 颜色空间中,图像像素P(i, j)的颜色值为 RGB,饱和度调节后的颜色值为RGBN,饱和度S的取值范围为[-100,100]。
①计算颜色R、G、B分量的最大值和最小值,分别记作rgbMax和rgbMin:

若rgbMax与rgbMin大小相等,则RGBN=RGB。
②HSL中的L分量值:

③计算饱和度S:

④计算RGBN(以下是伪代码):

上述算法即单一调节饱和度的算法逻辑。
编程实现
我们使用C语言实现饱和度调节算法(算法效果与PS中的完全一样):



算法效果如图1.34所示,可以看到本节介绍的算法和PS中的饱和度调节效果一致。

图1.34 图像饱和度调节效果对比
本节所有代码工程及DEMO见代码包中1.4.5文件夹中的文件。