三种灰度化效果不同,我们根据实际需要选择,但一般使用加权平均方法。
1.加权平均值法
根据我们人类大量的实验,我们发现白色是由大概0.299的红色,0.587的绿色,0.114的蓝色混合而成的,因此最常用的灰度变换公式如下:
D表示像素点(x,y)经转换后的灰度值,R、G、B为该像素点的三个通道的分量。
代码如下:
import cv2 as cv
import numpy as np
#读取图片
img = cv.imread("inpaint.png")
h = img.shape[0] #图片高
w = img.shape[1] #图片宽
#构造一个 与原图大小一样 的黑色图片
grayimg = np.zeros((h,w,3),np.uint8)
#灰度化
for i in range(h):
for j in range(w):
grayimg[i,j] = 0.3 * img[i,j][0] + 0.59 * img[i,j][1] + 0.11 * img[i,j][2]
cv.imshow("img", img)
cv.imshow("grayimg", grayimg)
cv.waitKey(0)
现象如下:
2.取最大值法
即将彩色图像中R、G、B三个分量中的最大值作为灰度图像的灰度值。
代码如下:
import cv2 as cv
import numpy as np
img = cv.imread("inpaint.png")
h = img.shape[0]
w = img.shape[1]
grayimg = np.zeros((h,w,3),np.uint8)
for i in range(h):
for j in range(w):
grayimg[i,j] = max(img[i,j][0] , img[i,j][1] ,img[i,j][2])
cv.imshow("img", img)
cv.imshow("grayimg", grayimg)
cv.waitKey(0)
3.平均值法
即对三个颜色分量求平均值得到灰度值:
代码如下:
import cv2 as cv
import numpy as np
img = cv.imread("inpaint.png")
h = img.shape[0]
w = img.shape[1]
grayimg = np.zeros((h,w,3),np.uint8)
for i in range(h):
for j in range(w):
grayimg[i,j] = (img[i,j][0] + img[i,j][1] +img[i,j][2])/3
cv.imshow("img", img)
cv.imshow("grayimg", grayimg)
cv.waitKey(0)