当前位置:   article > 正文

图像处理之图像灰度化_灰度图用数学公式表示

灰度图用数学公式表示

图像灰度化

   将彩色图像转化成为灰度图像的过程成为图像的灰度化处理。
  • 1

彩色图像中的每个像素的颜色有R、G、B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万 (255255255)的颜色的变化范用。而灰度图像是R、G、B三个分量相同的一种特殊的彩色图像(R=G=B),其一个像素点的变化范围为255种,所以在数字图像处理种一般先将各种格式的图像转变成灰度图像以使后续的图像的计算量变得少一些。灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征。

平均值法

取R、G、B分量中的均值,公式如下:
G r a y ( x , y ) = ( R ( x , y ) + G ( x , y ) + B ( x , y ) ) / 3 Gray(x,y)=(R(x,y)+G(x,y)+B(x,y))/3 Gray(x,y)=(R(x,y)+G(x,y)+B(x,y))/3

def grayByaverage(img):
    # 获取图像高度和宽度
    height = img.shape[0]
    width = img.shape[1]
    # 创建一幅图像
    grayimg = np.zeros((height, width, 3), np.uint8)
    # 图像最大值灰度处理
    for i in range(height):
        for j in range(width):
            # 获取图像R G B最大值
            gray = (int(img[i,j][0])+int(img[i,j][1])+int(img[i,j][2]))/3
            grayimg[i, j] = np.uint8(gray)
    return grayimg
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

最大值法

取R、G、B分量中的最大值,公式如下:
G r a y ( x , y ) = m a x ( R ( x , y ) + G ( x , y ) + B ( x , y ) ) Gray(x,y)=max(R(x,y)+G(x,y)+B(x,y)) Gray(x,y)=max(R(x,y)+G(x,y)+B(x,y))

def grayByaverage(img):
    # 获取图像高度和宽度
    height = img.shape[0]
    width = img.shape[1]
    # 创建一幅图像
    grayimg = np.zeros((height, width, 3), np.uint8)
    # 图像最大值灰度处理
    for i in range(height):
        for j in range(width):
            # 获取图像R G B最大值
            gray = (int(img[i,j][0])+int(img[i,j][1])+int(img[i,j][2]))/3
            grayimg[i, j] = np.uint8(gray)
    return grayimg
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

加权平均法

根据重要性及其它指标,将三个分量以不同的权值进行加权平均。由于人眼对绿色的敏感最高,对蓝色敏感最低,因此,按下式对RGB三分量进行加权平均能得到较合理的灰度图像。公式如下:
G r a y ( x , y ) = 0.11 R ( x , y ) + 0.59 G ( x , y ) + 0.30 B ( x , y ) Gray(x,y)=0.11R(x,y)+0.59G(x,y)+0.30B(x,y) Gray(x,y)=0.11R(x,y)+0.59G(x,y)+0.30B(x,y)

def grayByWeightedaverage(img):
    # 获取图像高度和宽度
    height = img.shape[0]
    width = img.shape[1]
    # 创建一幅图像
    grayimg = np.zeros((height, width, 3), np.uint8)
    for i in range(height):
        for j in range(width):
            # 获取图像R G B最大值
            gray = 0.30 * img[i, j][0] + 0.59 * img[i, j][1] + 0.11 * img[i, j][2]
            grayimg[i, j] = np.uint8(gray)
    return grayimg
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

三种灰度化结果如下:
在这里插入图片描述
结果分析:
三种灰度图像中,最大值法获得的灰度图较亮;加权平均值法获得的灰度图柔和,平均值获得的灰度图暗处较其他的颜色更深。

整体代码

import cv2
import numpy as np
import matplotlib.pyplot as plt

#图像灰度化
#最大值法
def grayBymax(img):
    # 获取图像高度和宽度
    height = img.shape[0]
    width = img.shape[1]
    # 创建一幅图像
    grayimg = np.zeros((height, width, 3), np.uint8)
    # 图像最大值灰度处理
    for i in range(height):
        for j in range(width):
            # 获取图像R G B最大值
            gray = max(img[i,j][0], img[i,j][1], img[i,j][2])
            grayimg[i, j] = np.uint8(gray)
    return grayimg


def grayByaverage(img):
    # 获取图像高度和宽度
    height = img.shape[0]
    width = img.shape[1]
    # 创建一幅图像
    grayimg = np.zeros((height, width, 3), np.uint8)
    # 图像最大值灰度处理
    for i in range(height):
        for j in range(width):
            # 获取图像R G B最大值
            gray = (int(img[i,j][0])+int(img[i,j][1])+int(img[i,j][2]))/3
            grayimg[i, j] = np.uint8(gray)
    return grayimg


def grayByWeightedaverage(img):
    # 获取图像高度和宽度
    height = img.shape[0]
    width = img.shape[1]
    # 创建一幅图像
    grayimg = np.zeros((height, width, 3), np.uint8)
    for i in range(height):
        for j in range(width):
            # 获取图像R G B最大值
            gray = 0.30 * img[i, j][0] + 0.59 * img[i, j][1] + 0.11 * img[i, j][2]
            grayimg[i, j] = np.uint8(gray)
    return grayimg


if __name__ == '__main__':
    img = cv2.imread('miao.jpg')
    opencv_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    grayByaverage=grayByaverage(img)
    grayBymax=grayBymax(img)
    grayByWeightedaverage=grayByWeightedaverage(img)
    # # 显示图像
    # cv2.imshow("src", img)
    # cv2.imshow("gray", opencv_gray)
    # # 等待显示
    # cv2.waitKey(0)
    # cv2.destroyAllWindows()
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    plt.figure(figsize=(80, 80))
    plt.rcParams['font.sans-serif'] = [
        'FangSong']  # 支持中文标签
    fig, ax = plt.subplots(2, 2)
    ax[0, 0].imshow(imgRGB)
    ax[0, 1].imshow(grayByaverage)
    ax[1, 0].imshow(grayBymax)
    ax[1, 1].imshow(grayByWeightedaverage)
    ax[0, 0].title.set_text("原图")
    ax[0, 1].title.set_text("平均值法")
    ax[1, 0].title.set_text("最大值法")
    ax[1, 1].title.set_text("加权平均值法")
    ax[0,0].axis("off")
    ax[0,1].axis("off")
    ax[1,0].axis("off")
    ax[1,1].axis("off")
    fig.tight_layout()
    plt.savefig("gray.jpg")
    plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82

参考文章
图像处理中的灰度化、二值化

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/596341
推荐阅读
相关标签
  

闽ICP备14008679号