读取图像,然后将彩色图像进行灰度化。
Author: Tian YJ
原图如下:
关于灰度图
灰度图像上每个像素的颜色值又称为灰度,指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0。所谓灰度值是指色彩的浓淡程度,灰度直方图是指一幅数字图像中,对应每一个灰度值统计出具有该灰度值的象素数。
灰度就是没有色彩,RGB色彩分量全部相等。如果是一个二值灰度图象,它的象素值只能为0或1,我们说它的灰度级为2。用个例子来说明吧:一个256级灰度的图象,如果RGB三个量相同时,如:RGB(100,100,100)就代表灰度为100,RGB(50,50,50)代表灰度为50。
现在大部分的彩色图像都是采用RGB颜色模式,处理图像的时候,要分别对RGB三种分量进行处理,实际上RGB并不能反映图像的形态特征,只是从光学的原理上进行颜色的调配。
图像灰度化处理可以作为图像处理的预处理步骤,为之后的图像分割、图像识别和图像分析等上层操作做准备。
灰度化处理方式
- 分量法
将彩色图像中的三分量的亮度作为三个灰度图像的灰度值,可根据应用需要选取一种灰度图像。
"""
AUTHOR: Tian YJ
CREATE: 2020-4-6
FUNCTION: BGR -> Gray
"""
import cv2
import numpy as np
# 灰度化函数
def BGR2GRAY(img):
b = img[:, :, 0].copy() # 蓝色通道
g = img[:, :, 1].copy() # 绿色通道
r = img[:, :, 2].copy() # 红色通道
# 灰度化(分别取r、g、b)
img[:, :, 0] = r
img[:, :, 1] = r
img[:, :, 2] = r
out = img
out = out.astype(np.uint8)
return out
# 读取图片
path = 'C:/Users/86187/Desktop/image/'
file_in = path + 'cake.jpg'
file_out = path + 'BGR2GRAY_1.jpg'
img = cv2.imread(file_in)
# 调用函数
out = BGR2GRAY(img)
# 保存图片
cv2.imwrite(file_out, out)
cv2.imshow("result", out)
cv2.waitKey(0)
cv2.destroyAllWindows()
r分量 | g分量 | b分量 |
---|---|---|
- 最大值法
将彩色图像中的三分量亮度的最大值作为灰度图的灰度值。
import cv2
import numpy as np
# 灰度化函数
def BGR2GRAY(img):
# 获取图片尺寸
H, W, C = img.shape
# 灰度化
out = np.ones((H,W,3))
for i in range(H):
for j in range(W):
out[i,j,:] = max(img[i,j,0], img[i,j,1], img[i,j,2])
out = out.astype(np.uint8)
return out
# 读取图片
path = 'C:/Users/86187/Desktop/image/'
file_in = path + 'cake.jpg'
file_out = path + 'BGR2GRAY_4.jpg'
img = cv2.imread(file_in)
# 调用函数
out = BGR2GRAY(img)
# 保存图片
cv2.imwrite(file_out, out)
cv2.imshow("result", out)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 平均值法
将彩色图像中的三分量亮度求平均得到一个灰度值。
"""
AUTHOR: Tian YJ
CREATE: 2020-4-6
FUNCTION: BGR -> Gray
"""
import cv2
import numpy as np
# 灰度化函数
def BGR2GRAY(img):
# 获取图片尺寸
H, W, C = img.shape
# 灰度化
out = np.ones((H,W,3))
for i in range(H):
for j in range(W):
out[i,j,:] = (img[i,j,0]+img[i,j,1]+img[i,j,2])/3
out = out.astype(np.uint8)
return out
# 读取图片
path = 'C:/Users/86187/Desktop/image/'
file_in = path + 'cake.jpg'
file_out = path + 'BGR2GRAY_5.jpg'
img = cv2.imread(file_in)
# 调用函数
out = BGR2GRAY(img)
# 保存图片
cv2.imwrite(file_out, out)
cv2.imshow("result", out)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 加权平均法
根据重要性及其它指标,将三个分量以不同的权值进行加权平均。由于人眼对绿色的敏感最高,对蓝色敏感最低,因此,按下式对RGB三分量进行加权平均能得到较合理的灰度图像。
"""
AUTHOR: Tian YJ
CREATE: 2020-4-6
FUNCTION: BGR -> Gray
"""
import cv2
import numpy as np
# 灰度化函数
def BGR2GRAY(img):
# 获取图片尺寸
H, W, C = img.shape
# 灰度化
out = np.ones((H,W,3))
for i in range(H):
for j in range(W):
out[i,j,:] = 0.299*img[i,j,0] + 0.578*img[i,j,1] + 0.114*img[i,j,2]
out = out.astype(np.uint8)
return out
# 读取图片
path = 'C:/Users/86187/Desktop/image/'
file_in = path + 'cake.jpg'
file_out = path + 'BGR2GRAY_6.jpg'
img = cv2.imread(file_in)
# 调用函数
out = BGR2GRAY(img)
# 保存图片
cv2.imwrite(file_out, out)
cv2.imshow("result", out)
cv2.waitKey(0)
cv2.destroyAllWindows()