本篇将介绍彩色图像灰度化和二值化的原理,并使用Python来实现对应算法内容。
[彩色图像灰度化]
1.定义
在上一节中,我们介绍了8位单色灰度图,它使用0-255来表示一个像素,但在实际使用中,我们最常用的还是彩色图像灰度化。对于32位bgra彩色图像,或者24位rgb/bgr彩色图像,一个像素由红绿蓝三原色混合而成,这也就是绘画中的调色过程,如何调制灰色?其实很简单,只要红绿蓝以相同程度进行混合,那么结果就呈现出灰色。基于这个原理,我们可以给出彩色图像灰度化的本质:R=G=B,即红绿蓝三通道的像素值相等,此时,彩色图就表现为灰度图,而这个过程,就叫做彩色图像的灰度化。
如图Fig.1所示,左侧位32bgra彩色图,右侧为对应的灰度图,该灰度图算法来自Photoshop“去色”命令。
(a)32位彩色图 (b)32位灰度图
Fig.1 彩色图像灰度化示例
2.算法
彩色图像灰度化的算法公式一般常用的有三种:明度公式,视觉公式和Photoshop去色公式。
①明度公式
明度公式,实际上就是取一个像素的红绿蓝三通道均值,将均值作为该像素的灰度值,以此实现灰度化效果。我们用Python语言实现,代码如下:
///
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as img
#明度法图像灰度化
def imgGray_Lum(im):
"""
image gray
im: source image
Return gray image.
"""
#imgarray = np.array(im)
imgarray = np.array(im, dtype=np.float32)#以浮点型读取图像数据
rows = im.shape[0]
cols = im.shape[1]
for i in range(rows):
for j in range(cols):
imgarray[i, j, :] = np.clip((imgarray[i, j, 0] + imgarray[i, j, 1] + imgarray[i, j, 2]) * 0.3333,0.0,255.0)
return imgarray.astype(np.uint8)#保存为uint8类型图像
im = img.imread("test.jpg")#图像读取
im = imgGray_Lum(im)
plt.imshow(im)#图像显示
img.imsave('save.jpg',im)
我们给出明度法彩色图像灰度化的效果测试,如图Fig.2所示。
Fig.2彩色图像灰度化(明度公式)
②视觉公式
由于人眼对于颜色的感应是不同的,人眼对绿色的敏感最高,对蓝色敏感最低,因此,上述公式是通过对像素RGB三分量进行加权平均,得到一种较合理的灰度图像,该公式也是最经典的灰度化公式。
我们用Python语言实现,代码如下:
/
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as img
#视觉法图像灰度化
def imgGray_Version(im):
"""
image gray
im: source image
Return gray image.
"""
imgarray = np.array(im, dtype = np.float32)
rows = im.shape[0]
cols = im.shape[1]
for i in range(rows):
for j in range(cols):
imgarray[i, j, :] = (imgarray[i, j, 0] * 0.299 + imgarray[i, j, 1] * 0.587 + imgarray[i, j, 2] * 0.114)
return imgarray.astype(np.uint8)
im = img.imread("test.jpg")#图像读取
im = imgGray_Version(im)
plt.imshow(im)#图像显示
img.imsave('save.jpg',im)
我们给出视觉颜色法彩色图像灰度化的效果测试,如图Fig.3所示。
Fig.3 彩色图像灰度化(视觉颜色公式)
③Photoshop去色公式
Photoshop中的去色公式,是一种考虑了图像对比度信息的灰度化公式,可以更好的突出颜色反差,在一些颜色较为接近的图像中表现会比较明显。它的算法比较简单,求取每个像素RGB三通道值的最大值和最小值,然后计算两者的均值,将均值作为灰度化结果即可。我们用Python语言来实现,代码如下:
///
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as img
#Photoshop法图像灰度化
def imgGray_PS(im):
"""
image gray
im: source image
Return gray image.
"""
imgarray = np.array(im, dtype = np.float32)
rows = im.shape[0]
cols = im.shape[1]
for i in range(rows):
for j in range(cols):
maxValue = np.maximum(imgarray[i, j, 0], np.maximum(imgarray[i, j, 1],imgarray[i, j, 2]))
minValue = np.minimum(imgarray[i, j, 0], np.minimum(imgarray[i, j, 1],imgarray[i, j, 2]))
imgarray[i, j, :] = (maxValue+ minValue) * 0.5
return imgarray.astype(np.uint8)
im = img.imread("test.jpg")#图像读取
im = imgGray_PS(im)
plt.imshow(im)#图像显示
img.imsave('save.jpg',im)
我们给出Photoshop去色法彩色图像灰度化的效果测试,如图Fig.4所示。
Fig.4 彩色图像灰度化(Photoshop去色法)
上述三种是常用的彩色图像灰度化算法,作为初学者,我们要透过现象看本质,抓住灰度化的本质,那就是:RGB三通道颜色值相同。
灰度化算法并非唯一,大家可以根据自己的需求设计自己的灰度化算法,如此才能举一反三,学以致用。
[彩色图像阈二值化]
作为本小节的第二个内容,彩色图像二值化实际上就是将一副彩色图,转换为只有两种颜色的图像,我们通常说的黑白阈值化只是其中的一个特例,或者说,黑白二值化是狭义的二值化理解,任意两种颜色二值化则是更为宽泛的理解。如图Fig.5所示,这些都叫作二值化。
Fig.5 彩色图像二值化示例
我们以灰度图像二值化为例,算法公式如下:
其中,C1和C2分别表示两种颜色值,如果为黑白二值化,则C1和C2表示黑白两种颜色,Threshold表示阈值,范围[0,255],根据阈值将像素划分为C1和C2两类。
我们用Python语言来实现灰度图像二值化算法,代码如下:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as img
#image binary threshold process
def imgBinaryThreshold(img, threshold=128):
"""
image binary threshold
im: source image
threshold:Threshold from 0 to 255
Return gray image.
"""
imgarray = np.array(im, dtype = np.uint8)
rows = im.shape[0]
cols = im.shape[1]
for i in range(rows):
for j in range(cols):
gray = (imgarray[i, j, 0] * 0.299 + imgarray[i, j, 1] * 0.587 + imgarray[i, j, 2] * 0.114)
if(gray < threshold):
imgarray[i, j, :] = 0
else:
imgarray[i, j, :] = 255
return imgarray.astype(np.uint8)
im = img.imread("test.jpg")#图像读取
im = imgBinaryThreshold(im)
plt.imshow(im)#图像显示
img.imsave('save.jpg',im)
我们给出彩色图像二值化的效果测试,如图Fig.6所示。
Fig.6 彩色图像二值化(黑白二值,阈值Threshold=128)
上述内容就是彩色图像二值化算法,实际上,无论灰度化还是彩色化都并非这么简单,但是作为初学者或者入门者,我们只有掌握了这些最基础的内容,才能去钻研更高深的理论,不积跬步无以至千里就是这个道理。
[知识扩展]
灰度化和二值化都是数字图像处理中很重要的组成部分,灰度化中比较热门的是对比度保留的彩色图像去色算法,研究在特殊图像颜色下的灰度化,如图Fig.7所示,一般的灰度化算法处理之后,图像原有的信息已经无法辨识,而对比度保留的灰度化算法处理结果依然可以清晰保留这些信息。
(a)原图 (b)Photoshop灰度化 (c)Photoshop去色 (d)对比度保留法
Fig.7 对比度保留法灰度化示例
Fig.5(d)所示方法的相关论文如下:
Color2Gray: Salience-Preserving Color Removal
Contrast Preserving Decolorization
Real-time Contrast Preserving Decolorization
二值化在图像分割中非常常见,二值化的研究难点是如何自适应设置阈值Threshold来将图像二值化处理,常简的一些自动二值化算法有:Ostu阈值化,P分位阈值化,统计阈值化,最大类间方差二值化等等。