问题描述
图像处理中的一个常见问题是将彩色 RGB 图像转换成单色灰度图像,第一种常用的方法是取三个元素 R,G,B 的均值。第二种常用的方式,又称为 NTSC 标准,考虑了人类的彩色感知体验,对于 R,G,B 三通道分别采用了不同的加权系数,分别是 R 通道 0.2989,G 通道0.5870,B 通道 0.1140. 实现一个函数 g = rgb1gray(f, method). 函数功能是将一幅 24 位的RGB 图像, f, 转换成灰度图像, g. 参数 method 是一个字符串,当其值为’average’ 时,采用第一种转换方法,当其值为’NTSC’时,采用第二种转换方法。将’NTSC’做为缺省方式。调用该函数,将提供的图像 mandril_color.tif 和lena512color.tiff 用上述两种方法转换成单色灰度图像,对于两种方法的结果进行简短比较和讨论。
代码实现
导库
import numpy as np
import cv2
灰度转换函数
def rgb1gray(f, method='NTSC'):
if method == 'average':
g = (f[:,:,0]+f[:,:,1]+f[:,:,2]) / 3
g = g.clip(0, 1)
return g
elif method == 'NTSC':
g = 0.2989*f[:, :, 0] + 0.5870*f[:, :, 1] + 0.1140*f[:, :, 2]
g = g.clip(0, 1)
return g
else:
raise Exception("输入格式有误")
归一化函数
def normalization(data):
_range = np.max(data) - np.min(data)
return (data - np.min(data)) / _range
主函数
if __name__ == '__main__':
#图片导入
im1 = cv2.imread('mandril_color.tif')
im2 = cv2.imread('lena512color.tiff')
#归一化
im1 = normalization(im1)
im2 = normalization(im2)
#NTSC方式转灰度图
g1 = rgb1gray(im1)
g2 = rgb1gray(im2)
#average方式转灰度图
g12 = rgb1gray(im1,'average')
g22 = rgb1gray(im2, 'average')
#对比作差
g3 = np.abs(g1 - g12)
g4 = np.abs(g2 - g22)
#第一幅图展示
cv2.imshow('mandril_color', im1)
cv2.imshow('mandril_color NTSC',g1)
cv2.imshow('mandril_color average', g12)
cv2.imshow('mandril_color diff',g3)
#第二幅图展示
cv2.imshow('lena512color', im2)
cv2.imshow('lena512color NTSC', g2)
cv2.imshow('lena512color average', g22)
cv2.imshow('lena512color diff', g4)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果展示