赞
踩
图像处理的第一步操作基本都是进行灰度化,二灰度化的方式都很多种,可以根据自己的具体需要进行参数调整,基本分为四大种,分别为YUV亮度灰度化、最大值灰度化、平均值灰度化、Gamma校正灰度化。
1.Gamma校正灰度化
原理如下计算公式:
G
r
a
y
=
R
2.2
+
(
1.5
G
)
2.2
+
(
0.6
B
)
2.2
1
+
1.
5
2.2
+
0.
6
2.2
2.2
Gray=\sqrt[2.2]{\frac{R^{2.2}+(1.5G)^{2.2}+(0.6B)^{2.2}}{1+1.5^{2.2}+0.6^{2.2}}}
Gray=2.21+1.52.2+0.62.2R2.2+(1.5G)2.2+(0.6B)2.2
注意这里的2.2次方和2.2次方根,RGB颜色值不能简单直接相加,而是必须用2.2次方换算成物理光功率。因为RGB值与功率并非简单的线性关系,而是幂函数关系,这个函数的指数称为Gamma值,一般为2.2,而这个换算过程,称为Gamma校正。
import cv2 import numpy as np import math import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文 def Gamma_GRAY(picture_path): #Gamma校正灰度化:Gray= # 读取图像 img = cv2.imread(picture_path) # 获取图像尺寸 h, w = img.shape[0:2] # 自定义空白单通道图像,用于存放灰度图 gray = np.zeros((h, w), dtype=img.dtype) # 对原图像进行遍历,然后分别对B\G\R按比例灰度化 for i in range(h): for j in range(w): a = img[i, j, 2] ** (2.2) + 1.5 * img[i, j, 1] ** (2.2) + 0.6 * img[i, j, 0] ** (2.2) # 分子 b = 1 + 1.5 ** (2.2) + 0.6 ** (2.2) # 分母 gray[i, j] = pow(a / b, 1.0 / 2.2) # 开2.2次方根 gray = cv2.cvtColor(gray, cv2.COLOR_BGR2RGB) # BGR转换为RGB显示格式,方便通过matplotlib进行图像显示 plt.imshow(gray) plt.title('Gamma校正灰度化') plt.axis('off') # 关闭坐标轴 设置为on则表示开启坐标轴 plt.show() # 显示图像
2.平均值灰度化
原理: 对B、G、R三通道像素求取平均值作为灰度值,公式为:
g
r
a
y
=
(
B
+
G
+
R
)
/
3
gray=(B+G+R)/3
gray=(B+G+R)/3
def Avrage_GRAY(picture_path): #平均值灰度化:对B、G、R三通道像素求取平均值作为灰度值,公式为:gray=(B+G+R)/3 # 读取图像 img = cv2.imread(picture_path) # 获取图像尺寸 h, w = img.shape[0:2] # 自定义空白单通道图像,用于存放灰度图 gray = np.zeros((h, w), dtype=img.dtype) # 对原图像进行遍历,然后分别对B\G\R按比例灰度化 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 = cv2.cvtColor(gray, cv2.COLOR_BGR2RGB) # BGR转换为RGB显示格式,方便通过matplotlib进行图像显示 plt.imshow(gray) plt.title('平均值灰度化') plt.axis('off') # 关闭坐标轴 设置为on则表示开启坐标轴 plt.show() # 显示图像
3.最大值灰度化
原理:以B、G、R通道中最大的像素作为整体像素,公式为:
B
=
G
=
R
=
m
a
x
(
[
B
,
G
,
R
]
)
B=G=R=max([B,G,R])
B=G=R=max([B,G,R])
def Max_GRAY(picture_path): #最大值灰度化:以B、G、R通道中最大的像素作为整体像素,公式为:B=G=R=max([B,G,R]) #读取图像 img = cv2.imread(picture_path) # 获取图像尺寸 h, w = img.shape[0:2] # 自定义空白单通道图像,用于存放灰度图 gray = np.zeros((h, w), dtype=img.dtype) # 对原图像进行遍历,然后分别对B\G\R按比例灰度化 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 = cv2.cvtColor(gray, cv2.COLOR_BGR2RGB) # BGR转换为RGB显示格式,方便通过matplotlib进行图像显示 plt.imshow(gray) plt.title('最大值灰度') plt.axis('off') # 关闭坐标轴 设置为on则表示开启坐标轴 plt.show() # 显示图像
4.YUV亮度灰度化
原理:根据YUV的颜色空间中,Y的分量的物理意义是点的亮度,由该值反映亮度等级,根据RGB和YUV颜色空间的变化关系可建立亮度Y与R、G、B三个颜色分量的对应,以这个亮度值表达图像的灰度值。公式为:
Y
=
0.3
R
+
0.59
G
+
0.11
B
Y=0.3R+0.59G+0.11B
Y=0.3R+0.59G+0.11B
def Cv2_GRAY(picture_path): # YUV亮度灰度处理:Y=0.3R+0.59G+0.11B
#读取图像
img=cv2.imread(picture_path)
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#BGR转换为灰度
print(gray.shape)
img= cv2.cvtColor(gray,cv2.COLOR_BGR2RGB)#BGR转换为RGB显示格式
plt.imshow(img)
plt.title('灰度处理')
plt.axis('off')#关闭坐标轴 设置为on则表示开启坐标轴
plt.show()#显示图像
return gray
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。