title: 图片的四种灰度化方式
author: BbiHH
tags:
(原创)
灰度化,在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。一般有分量法 最大值法平均值法加权平均法四种方法对彩色图像进行灰度化。灰度值大的像素点比较亮(像素值最大为255,为白色),反之比较暗(像素最下为0,为黑色)。
现在大部分的彩色图像都是采用RGB颜色模式,处理图像的时候,要分别对RGB三种分量进行处理,实际上RGB并不能反映图像的形态特征,只是从光学的原理上进行颜色的调配。现在有很多其他的颜色模式,例如HSI模式,HSI是由色调,饱和度,亮度三个分量来表示颜色。HSI比RGB更符合人的视觉特性。但是HSI也是三通道,真正反映图像特征的变量是I,其他都是色彩的反映。所以我们经常要把图像弄成8位的灰度值图像直接进行处理,可以通过直方图,灰度变化,还有正交变换之类的进行处理。甚至经常把图像分割之后变成二值图像处理。
下面介绍图片灰度变化的方法。
代码演示:
#coding=utf-8
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread("D:\图片\Saved Pictures\qianxun.jpg",cv2.IMREAD_COLOR)
# 直接取分量
b = img[:,:,0]
g = img[:,:,1]
r = img[:,:,2
cv2.imshow('灰度图-分量b',b)
cv2.imshow('灰度图-分量g',g)
cv2.imshow('灰度图-分量r',r)
R=G=B=max(R,G,B)
代码示例:
#coding=utf-8
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread("D:\图片\Saved Pictures\qianxun.jpg",cv2.IMREAD_COLOR)
MaxGary = np.zeros(img.shape[:2],dtype = "uint8")
for i in range(img.shape[0]):
for j in range(img.shape[1]):
MaxGary[i,j] = max(img[i,j][0],img[i,j][1],img[i,j][2])
cv2.imshow('灰度图-最大取法',MaxGary)
R=G=B = (R+B+G)/3 将三通道分量的颜色值相加取平均值
代码实例:
#coding=utf-8
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread("D:\图片\Saved Pictures\qianxun.jpg",cv2.IMREAD_COLOR)
NolGary = np.zeros(img.shape[:2],dtype = "uint8")
for i in range(img.shape[0]):
for j in range(img.shape[1]):
NolGary[i,j] = (int)((img[i,j][0]+img[i,j][1]+img[i,j][2])/3)
cv2.imshow('灰度图-平均值法',NolGary)
按照一定的权值,对R,G,B的值加权平均。 由于人眼对绿色最为敏感,红色次之,蓝色的敏感性最低,因此权值 wG>wR>wB将得到较易识别的灰度图像。一般,wB=0.114,wG=0.578,wR=0.299 得到的灰度图像效果最好。
代码实例:
#coding=utf-8
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread("D:\图片\Saved Pictures\qianxun.jpg",cv2.IMREAD_COLOR)
PeoGary = np.zeros(img.shape[:2],dtype = "uint8")
for i in range(img.shape[0]):
for j in range(img.shape[1]):
PeoGary[i,j] = 0.114*img[i,j][0] + 0.578 *img[i,j][1] + 0.299 *img[i,j][2]
cv2.imshow('灰度图-加权平均值法',PeoGary)
四种方法总和:
#coding=utf-8
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread("D:\图片\Saved Pictures\qianxun.jpg",cv2.IMREAD_COLOR)
# 直接取分量
b = img[:,:,0]
g = img[:,:,1]
r = img[:,:,2]
cv2.imshow('灰度图-分量b',b)
cv2.imshow('灰度图-分量g',g)
cv2.imshow('灰度图-分量r',r)
# 取最大值
MaxGary = np.zeros(img.shape[:2],dtype = "uint8")
for i in range(img.shape[0]):
for j in range(img.shape[1]):
MaxGary[i,j] = max(img[i,j][0],img[i,j][1],img[i,j][2])
cv2.imshow('灰度图-最大取法',MaxGary)
# 平均法
NolGary = np.zeros(img.shape[:2],dtype = "uint8")
for i in range(img.shape[0]):
for j in range(img.shape[1]):
NolGary[i,j] = (int)((img[i,j][0]+img[i,j][1]+img[i,j][2])/3)
cv2.imshow('灰度图-平均值法',NolGary)
# 加权平均法
PeoGary = np.zeros(img.shape[:2],dtype = "uint8")
for i in range(img.shape[0]):
for j in range(img.shape[1]):
PeoGary[i,j] = 0.114*img[i,j][0] + 0.578 *img[i,j][1] + 0.299 *img[i,j][2]
cv2.imshow('灰度图-加权平均值法',PeoGary)
cv2.imshow('原图',img)
cv2.waitKey(0)
效果比较