灰度化
预备知识
在了解图像处理的基本操作之前,我们需要知道关于图像的一些基本知识。我们这里所说的图像处理实质上是数字图像处理,因为计算机只能对数字信号进行处理,因此存储在计算机中的图像都是实际图像经过离散化处理之后得到的。
图像是以数组的形式存储在计算机中间的,对于彩色图像而言,存储形式是三个离散的二维数组,每个数组对应一个颜色通道,具体在python中,图像的数据结构为numpy数组。这里需要注意的是,用于表示图像的numpy数组,其数据类型必须是整数类型而不能是浮点数类型,这一点我们在下面还会提到。
灰度化操作
在opencv中间有自带的函数可以直接进行灰度化,在这里我想介绍一下如何不借助opencv的函数自己编写程序来实现灰度化。
我们主要是通过这一公式来实现灰度化
因此我们的思路也十分明确,将三个颜色通道的值分别读取出来就利用公式就可以实现。当然这里也有几点注意事项:
-
numpy数组的三个颜色通道从小到大一次为G,B,R而不是我们按照常说的RGB。
-
通过numpy数组可以实现高效的向量化运算,因此要避免使用效率低下的for循环来求值。
下面上代码
def Gray_img(img):
# img_gray = cv.cvtColor(img_2, cv.COLOR_RGB2GRAY)
print(img.shape)
(h, w, c) = img_2.shape
img_b = img[:, :, 0]
img_g = img[:, :, 1]
img_r = img[:, :, 2]
img_gray = img_r * 0.299 + img_g * 0.587 + img_b * 0.114
img_gray = img_gray.astype(np.uint8) (1)
cv.imshow('', img_gray)
cv.waitKey(0)
return img_gray
这里面请大家关注一下代码(1),大家可以尝试将这一行代码注释掉再去运行看看是什么样的结果。这里面就是我们在上面所说的,用于表示图像的numpy数组数据类型必须为整型,如果没有这一行,那么数据类型就会成为浮点型,此时我们再将其显示出来就不会得到我们想要的结果。
完整代码如下
import numpy as np
import cv2 as cv
path = 'image/lena.jpg' #图片存储路径,注意不能有中文
def Gray_img(img):
# img_gray = cv.cvtColor(img_2, cv.COLOR_RGB2GRAY)
print(img.shape)
(h, w, c) = img.shape
img_b = img[:, :, 0]
img_g = img[:, :, 1]
img_r = img[:, :, 2]
img_gray = img_r * 0.299 + img_g * 0.587 + img_b * 0.114
img_gray = img_gray.astype(np.uint8) # (1)
cv.imshow('', img_gray)
cv.waitKey(0)
return img_gray
img = cv.imread(path)
img_gray = Gray_img(img)
我们可以得到这样的效果:
来源:CSDN
作者:CoderPro
链接:https://blog.csdn.net/qq_38896666/article/details/104706742