文章目录
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.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()
图像如下: