挑战图像处理100问(2)——灰度化

在这里插入图片描述
读取图像,然后将彩色图像进行灰度化。
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并不能反映图像的形态特征,只是从光学的原理上进行颜色的调配。

图像灰度化处理可以作为图像处理的预处理步骤,为之后的图像分割、图像识别和图像分析等上层操作做准备。


灰度化处理方式
  1. 分量法
    将彩色图像中的三分量的亮度作为三个灰度图像的灰度值,可根据应用需要选取一种灰度图像。
    Gray1(i,j)=R(i,j)Gray_1(i,j)=R(i,j)
    Gray2(i,j)=G(i,j)Gray_2(i,j)=G(i,j)
    Gray3(i,j)=B(i,j)Gray_3(i,j)=B(i,j)
"""
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分量
在这里插入图片描述 在这里插入图片描述 在这里插入图片描述
  1. 最大值法
    将彩色图像中的三分量亮度的最大值作为灰度图的灰度值。
    Gray(i,j)=max{R(i,j),G(i,j),B(i,j)}Gray(i,j)=max{R(i,j),G(i,j),B(i,j)}
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()

在这里插入图片描述

  1. 平均值法
    将彩色图像中的三分量亮度求平均得到一个灰度值。
    Gray(i,j)=(R(i,j)+G(i,j)+B(i,j))/3Gray(i,j)=(R(i,j)+G(i,j)+B(i,j))/3
"""
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()

在这里插入图片描述

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

Gray(i,j)=0.299R(i,j)+0.578G(i,j)+0.114B(i,j)Gray(i,j)=0.299*R(i,j)+0.578*G(i,j)+0.114*B(i,j)

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

在这里插入图片描述

原文地址:https://www.cnblogs.com/Jack-Tim-TYJ/p/12831926.html