基于Python的RGB图像处理探究
2022-03-10李响
李 响
(1.开封大学 信息工程学院,河南 开封 475004;2.开封市公共安全信息化工程技术研究中心,河南 开封 475004)
0 引言
随着人工智能、机器学习的兴起,Python这门诞生于20世纪90年代初的编程语言得到迅猛发展,市场占有率逐步攀升。2021年10月,Python超越Java语言、C语言等,荣登TIOBE榜首,成为最受欢迎的编程语言。Python不仅易学易用,更重要的是,它拥有功能强大、内容丰富的多种第三方扩展库,能满足常见的开发需求。
近年来,无论是科研领域还是日常生活领域,对图像处理的要求都越来越高。图像清晰度的提升,也使得需要处理的数字图像的数据量大幅增加。这样一来,选择一种简单、快捷、高效的图像处理语言就成为关键。实践证明,拥有PIL库及NumPy库的Python语言可以满足编写简单、处理速度快的要求,适合于数字图像处理的开发。
1 RGB图像与Python
计算机中存储和处理的图像都是数字图像,像素是数字图像的最小组成单位。数字图像被分成若干小方格,每个方格代表一个像素。像素有明确的位置和被分配的色彩数值,这样才可以实现图片数字化。在表示像素的色彩数值时,常常用到RGB。RGB是一种广泛使用的色彩模式,RGB分别代表红(Red)、绿(Green)、蓝(Blue)三基色。在RGB色彩模式中,红绿蓝三基色分别被赋予0—255范围内相应的强度等级。通过这三个颜色通道的变化和叠加,我们可以得到各种颜色。由此可知,在0—255范围内取值的有序三元数(R,G,B)的集合,即为 RGB 色彩模式[1]。
RGB 模式={(R,G,B) |0≤R≤255,0≤G≤255,0≤B≤255}.
依据像素的位置及RGB值,在进行数字图像处理时,可以将数字图像转换成一个M*N*3的三维数组。其中,M代表图像每行的像素数,N代表图像每列的像素数,3是指该像素点的RGB三元数值。这样一来,在计算机中对RGB图像的处理就转变为对三维数组的操作。
Python语言中有两个功能强大的第三方扩展库——NumPy(Numeric Python)和PIL(Python Image Library)。通过使用这两个库,我们能完成常见的RGB图像处理操作。NumPy库提供了可以表示N维数组的ndarray对象,对数组数据,无须使用循环就可以进行快速运算,简单、高效。PIL是一个具有强大图像处理能力的第三方库。Image类是 PIL中重要的类之一,通过它,可以实现简单的图像读取、图像旋转、格式转换、图像调整等基本操作[2]。使用这两个库,我们可以实现RGB图像的数字化,可以真切地感受到数字化的魅力。
例如,使用PhotoShop生成一个2*3的RGB图像(见图1)。
图1 2*3的RGB图像
可以看到,此RGB图像即为一个2*3*3的三维数组,前两个维度分别代表图片的高度和宽度,第三个维度上的三个元素即为该位置上像素的RGB值。
2 RGB图像的处理
2.1 基本步骤
RGB图像转换成数组后,我们就可以通过对数组的运算操作来处理图像了。使用Python语言进行RGB图像处理的一般步骤如下:
(1)读入图像;
(2)获取图像的RGB值,将其转换为nadarry数组;
(3)按照图像处理要求,运用数组运算操作,修改RGB图像数组元素的值;
(4)将修改后的结果保存为新的图像文件。
2.2 图像的灰度变换
灰度变换是图像处理软件的基本功能需求,也是图像增强技术的一种经典方法。灰度变换采用基本的数字图像空间域处理方法来实现。它的原理是,将原图像的每一个像素按照某一变换函数关系都对应到一个灰度值上。灰度变换的主要目的是改善图像显示效果或突出图像中令人感兴趣的部分。它在生物医学、公共安全等领域有着广泛用途。灰度变换也被称为图像的对比度拉伸或对比度增强[3]。例如,为了突出显示图像的某一细节,可将该图像的灰度级扩展或压缩,这是图像增强技术的具体应用。
在Python语言条件下,我们通常使用PIL库中的Image类读入图片,将转换后的图片存入NumPy库的ndarray数组中,然后按需求执行相应的数学运算,从而达到图像灰度变换的目的。
例如,采用下面的代码来实现:将图2(原始图像)通过反相处理,变换为图3(反向图像);使用NumPy库中的dot()点乘函数,将RGB彩色图片变换为黑白图片(见图4);对原图像的灰度值做区间压缩及扩展,得到图5。
图2 原始图像kfdx.jpg
图3 反向图像three.jpg
图4 黑白图像 four.jpg
图5 灰度值区间变换图像five.jpg
3 RGB图像手绘效果的实现
在图像处理软件中,实现图像的手绘效果是一个常见功能。图像的手绘效果是在图像灰度化处理的基础上,由立体效果和明暗效果叠加而成的。灰度表示图像的明暗变化情况,梯度值是指明暗的变化率。可见,通过调整像素的梯度值,可以间接改变图片的明暗程度。立体效果可以通过添加虚拟深度值来实现。
在Python语言条件下,通过编程实现图像手绘效果的核心和关键是:利用梯度函数找到物体边缘,建立图像的像素值与梯度值的反比关系,以达到用黑色线表示物体边缘的目的。为此,须设计一个位于图像斜上方的虚拟光源,光源相对于图像的俯视角为Elevation,方位角是Azimuth,如图6所示。建立光源对各像素点梯度值的影响函数,计算出新的像素值。在利用梯度重构图像时,用每个像素的梯度值和各方向的影响因子合成灰度值,并归一化到0—255区间,舍弃掉少许溢出的灰度值,以避免错误的产生。最后,将数组重构为图像。
图6 虚拟光源效果模型
例如,采用下面的代码来实现:将原始图像(见图2)转换为手绘效果图像(见图7)。
图7 手绘效果图像kfdx_demo.jpg
4 总结
数字图像的处理主要包括提高图像的视感质量、提取图像中所包含的某些特征、图像数据的变换、编码和压缩等内容[4]。使用Python的NumPy和PIL扩展库,可以使数字图像处理程序代码变得简单、高效。这一方法值得应用和推广。