图像灰度化处理

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三分量进行加权平均能得到较合理的灰度图像:

\[Gray(i,j)=0.299*R(i,j)+0.578*G(i,j)+0.114*B(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()

图像如下:

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()

图像如下:

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()

图像如下:

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()

图像如下:

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()

图像如下:

posted @ 2022-10-11 08:44  crossoverpptx  阅读(1197)  评论(0编辑  收藏  举报