当前位置:   article > 正文

图像灰度化处理

图像灰度化

1. 图像灰度化

RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255,当灰度为255的时候,表示最亮(纯白);当灰度为0的时候,表示最暗(纯黑)。

灰度化的好处是:相较于彩色图像灰度图像占内存更小,运行速度更快;灰度图像后可以在视觉上增加对比,突出目标区域。

2. 图像灰度化处理方法

图像灰度化处理有三种常用方法:最大值法、平均值法和加权平均法。

2.1 最大值法

最大值法,即直接取R,B,G三个分量中数值最大的分量的数值(0视为最小,255视为最大)。公式为:R=G=B=max(R,G,B)。

2.2 平均值法

平均值法,即取R,B,G三个分量中数值的均值。公式为:R=G=B=(R+G+B)/3。

2.3 加权平均法

根据重要性及其它指标,将三个分量以不同的权值进行加权平均。由于人眼对绿色的敏感最高,对蓝色敏感最低,因此,按下式对RGB三分量进行加权平均能得到较合理的灰度图像:

G r a y ( i , j ) = 0.299 ∗ R ( i , j ) + 0.578 ∗ G ( i , j ) + 0.114 ∗ B ( i , j ) Gray(i,j)=0.299*R(i,j)+0.578*G(i,j)+0.114*B(i,j) Gray(i,j)=0.299R(i,j)+0.578G(i,j)+0.114B(i,j)

3. 图像灰度化处理方法的Python实现

代码如下:

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

img = cv.imread('lenna.png')
img1 = cv.cvtColor(img, cv.COLOR_BGR2RGB) # BGR转化为RGB格式
plt.imshow(img1)
plt.title('Src_img')
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

图像如下:
在这里插入图片描述

3.1 最大值法

代码如下:

def Max_Gray(srcImg_path):
    img = cv.imread(srcImg_path)
    h,w = img.shape[0:2] # 获取图像尺寸
    gray = np.zeros((h,w),dtype=img.dtype) # 自定义空白单通道图像,用于存放灰度图
    # 对原图像进行遍历,然后分别灰度化
    for i in range(h):
        for j in range(w):
            gray[i,j] = max(img[i,j,0],img[i,j,1],img[i,j,2]) # 求3通道中最大值
    gray = cv.cvtColor(gray,cv.COLOR_BGR2RGB)
    plt.imshow(gray)
    plt.title('Max_Gray')
    #plt.axis('on')
    plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

图像如下:
在这里插入图片描述

3.2 平均值法

代码如下:

def Avrage_Gray(srcImg_path):
    img = cv.imread(srcImg_path)
    h,w = img.shape[0:2] # 获取图像尺寸
    gray = np.zeros((h,w),dtype=img.dtype) # 自定义空白单通道图像,用于存放灰度图
    # 对原图像进行遍历,然后分别灰度化
    for i in range(h):
        for j in range(w):
            gray[i,j] = (int(img[i,j,0])+int(img[i,j,1])+int(img[i,j,2]))/3 # 求3通道像素的平均值作为灰度值
    gray = cv.cvtColor(gray,cv.COLOR_BGR2RGB)
    plt.imshow(gray)
    plt.title('Avrage_Gray')
    #plt.axis('on')
    plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

图像如下:
在这里插入图片描述

3.3 加权平均法

代码如下:

def WeightedAvrage_Gray(srcImg_path):
    img = cv.imread(srcImg_path)
    h,w = img.shape[0:2] # 获取图像尺寸
    gray = np.zeros((h,w),dtype=img.dtype) # 自定义空白单通道图像,用于存放灰度图
    # 对原图像进行遍历,然后分别灰度化
    for i in range(h):
        for j in range(w):
            gray[i,j] = 0.114*int(img[i,j,0])+0.578*int(img[i,j,1])+0.299*int(img[i,j,2])
    gray = cv.cvtColor(gray,cv.COLOR_BGR2RGB)
    plt.imshow(gray)
    plt.title('WeightedAvrage_Gray')
    #plt.axis('on')
    plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

图像如下:
在这里插入图片描述

3.4 最大值法、平均值法和加权平均法的比较

综上,3种方法的灰度处理图像如下所示:
在这里插入图片描述

可以发现,最大值法转换的灰度图亮度最高,平均值法产生的灰度图像较暗,加权平均法得到的灰度图像明暗介于两者之间。

3.5 opencv-python中灰度处理方法的应用

opencv-python中有图像灰度处理的接口,直接调用即可:

img = cv.imread('lenna.png')
img1 = cv.cvtColor(img, cv.COLOR_BGR2RGB) # BGR转化为RGB格式
plt.subplot(121)
plt.imshow(img1)
plt.title('Src_img')

# 灰度转换
image2 = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
plt.subplot(122)
plt.imshow(image2, plt.cm.gray)
plt.title('Gray_img')
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

图像如下:
在这里插入图片描述

4. 源码仓库地址

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】

推荐阅读
相关标签