python 图片灰度化 opencv-python

1、简介

opencv是一个强大的图像处理和计算机视觉库,实现了很多实用算法,而opencv-python是OpenCV的python接口。直接安装opencv-python包(非官方):

 pip install opencv-python

2、知识点

图片都是像素点

图片是由一个一个的像素点组成的,像素是图像的最小单元,我们右键——>属性去查看图片的信息,看到图片的尺寸如下图:即宽度是372个像素,高度也是300个像素,也就是说这张图片是由一个372 * 300的像素点矩阵构成的,这个矩阵是372行,300列,共有372 * 300 = 111600个像素点。

图片的像素信息

绝大部分图片是 RGB 类型的,即是用RGB(红绿蓝)三原色组成的图片。在图像处理中,用RGB三个分量(R:Red,G:Green,B:Blue),即红、绿、蓝三原色来表示真彩色,R分量,G分量,B分量的取值范围均为0~255,比如电脑屏幕上的一个红色的像素点的三个分量的值分别为:255,0,0

3、图片灰度化

什么叫图片的灰度化呢?其实很简单,就是让像素点矩阵中的每一个像素点都满足下面的关系:R=G=B(就是红色变量的值,绿色变量的值,和蓝色变量的值,这三个值相等),此时的这个值叫做灰度值。

理解一张图片是由一个像素点矩阵构成,就知道我们对图像的处理就是对这个像素点矩阵的操作,想要改变某个像素点的颜色,只要在这个像素点矩阵中找到这个像素点的位置,比如第x行,第y列,所以这个像素点在这个像素点矩阵中的位置就可以表示成(x,y),因为一个像素点的颜色由红、绿、蓝三个颜色变量表示,所以我们通过给这三个变量赋值,来改变这个像素点的颜色,比如改成红色(255,0,0),可以表示为(x,y,(R=255,G=0,B=0))x行y列的像素值为(255,0,0)。

平均值法:

是转化后R,G,B的值为转化前R,G,B的平均值

灰度化后的R=(处理前的R + 处理前的G +处理前的B)/ 3
灰度化后的G=(处理前的R + 处理前的G +处理前的B)/ 3
灰度化后的B=(处理前的R + 处理前的G +处理前的B)/ 3

加权平均法(处理效果最好):

按照一定权值,对R,G,B的值加权平均

灰度化后的R =  处理前的R * 0.3+ 处理前的G * 0.59 +处理前的B * 0.11
灰度化后的G =  处理前的R * 0.3+ 处理前的G * 0.59 +处理前的B * 0.11
灰度化后的B =  处理前的R * 0.3+ 处理前的G * 0.59 +处理前的B * 0.11

最大值发:

使转化后的R,G,B得值等于转化前3个值中最大的一个

   灰度化后的R、G、B=处理前的R、G、B中的最大值

4、代码示例

# 先加载一张图片 打印它的一些关键信息
image = cv.imread("C:/path/to/image/doge.png")
print(image.shape) # (372, 300, 3)
print(image.size) # 334800
print(image.dtype) # uint8
def gray_by_max():
    # 最大值法:使转化后的R,G,B得值等于转化前3个值中最大的一个,即: R=G=B=max(R,G,B)这种方法转换的灰度图亮度很高。
    dst = np.zeros((image.shape[0], image.shape[1], 1), np.uint8)
    for i in range(image.shape[0]):
        for j in range(image.shape[1]):
            dst[i, j] = max(image[i, j][0], image[i, j][1], image[i, j][2])
    print(dst)
    cv.imwrite("C:/path/to/image/doget_max_gray.png", dst)
最大灰度法
def gray_by_avg():
    # 平均值法:是转化后R,G,B的值为转化前R,G,B的平均值。即:R=G=B=(R+G+B)/3  这种方法产生的灰度图像比较柔和。
    dst = np.zeros((image.shape[0], image.shape[1], 1), np.uint8)
    for i in range(image.shape[0]):
        for j in range(image.shape[1]):
            dst[i, j] = (image[i, j][0] + image[i, j][1] + image[i, j][2]) / 3
    print(dst)
    cv.imwrite("C:/path/to/image/doget_avg_gray.png", dst)
平均灰度法
def gray_with_weight():
    # 加权平均值法:按照一定权值,对R,G,B的值加权平均,即:R=G=B=(W(r) * R+ W(g) * G+ W(b) * B),
    # 其中W(x)分别为R,G,B的权值,取不同的值形成不同的灰度图像。由于人眼对绿色最为敏感,红色次之,对蓝色的敏感性最低,因此一般情况下,
    # W(r)=0.299, W(g)=0.587, W(b)=0.114得到的灰度图像效果最好。
    dst = np.zeros((image.shape[0], image.shape[1], 3), np.uint8)
    for i in range(image.shape[0]):
        for j in range(image.shape[1]):
            dst[i, j] = (0.3 * image[i, j][0] + 0.11 * image[i, j][1] + 0.59 * image[i, j][2])
    print(dst)
    cv.imwrite("C:/path/to/image/doget_weight_gray.png", dst)
加权灰度法