Python数字图像处理1.2---彩色图像灰度化和二值化

 

本篇将介绍彩色图像灰度化和二值化的原理,并使用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去色公式。

        ①明度公式

        Gray(i,j)=[R(i,j)+G(i,j)+B(i,j)]/3

         R(i,j)=G(i,j)=B(i,j)=Gray(i,j)

        明度公式,实际上就是取一个像素的红绿蓝三通道均值,将均值作为该像素的灰度值,以此实现灰度化效果。我们用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彩色图像灰度化(明度公式)

②视觉公式

        Gray(i,j)=0.299R(i,j)+0.587G(i,j)+0.114B(i,j)

        R(i,j)=G(i,j)=B(i,j)=Gray(i,j)

        由于人眼对于颜色的感应是不同的,人眼对绿色的敏感最高,对蓝色敏感最低,因此,上述公式是通过对像素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去色公式

        Gray(i,j)=[max(R(i,j),G(i,j),B(i,j))+min(R(i,j)+G(i,j)+B(i,j))]/2

        R(i,j)=G(i,j)=B(i,j)=Gray(i,j)

        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分位阈值化,统计阈值化,最大类间方差二值化等等。

 

 

 

 

 

 

  • 12
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Trent1985

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值