opencv-python常用函数解析及参数介绍(一)——图像读取及其通道与灰度

前言

本文将简单介绍opencv-python中的图像以及视频的读取,并且介绍灰度图与彩图的通道,以及灰度图与单通道的联系与区别

1.读图片

假设我们有这样一张图片,它的名字是photo.jpg
在这里插入图片描述

读彩图

打开图片需要的参数有图片的路径和图片的打开方式
打开方式如下

cv2.IMREAD_COLOR cv2.IMREAD_GRAYSCALE
彩色图片(默认) 灰度图
img=cv2.imread('photo.jpg') # 此时默认打开的是彩色图片
img=cv2.imread('photo.jpg', cv2.IMREAD_COLOR)

这两种方式打开的都是彩色图,使用cv2打开的图片是以numpy.ndarray类型存储的

读灰度图

gray=cv2.imread('photo.jpg',cv2.IMREAD_GRAYSCALE)

2.显示图片

这里用到了三个函数

函数 参数及解释
cv2.imshow 需要两个参数,显示图片的名字(字符串类型),和numpy.ndarray类型的数据
cv2.waitKey 需要一个时间参数表示等待时间(毫秒级),参数是0时表示任意键终止
cv2.destroyAllWindows 用于消除窗口

显示彩图

cv2.imshow('image',img) 
cv2.waitKey(0) 
cv2.destroyAllWindows()

在这里插入图片描述

显示灰度图

这里将waitKey参数设成10000,及图片展示10000毫秒后退出

cv2.imshow('image',gray) 
cv2.waitKey(10000) 
cv2.destroyAllWindows()

灰度图与彩图的区别

我们先拿读出来的彩图来解释
cv2读出来的图片存储格式是numpy.ndarray,存储的顺序是(h, w, c),即(图片高,图片宽,通道数),图片高和图片宽可以理解,那么什么是通道呢

在cv2中通道就是指的三原色,即R(红)、G(绿)、B(蓝),尤为注意的是cv2中通道的顺序是(b, g, r)

既然彩图是由bgr混合成的,那么灰度图就很容易理解是只有一个通道了

我们还可以通过查看图片的形状来验证这一点
在这里插入图片描述
可以看到彩图和灰度图的差异
那么如果我们只取其中一个通道会怎样呢?

从彩图中分离单通道

为了表示方便我们先定义一个显示图像的函数

def cv_show(name,img):
    cv2.imshow(name,img) 
    cv2.waitKey(0) 
    cv2.destroyAllWindows()

然后我们分别选取其中一个通道

cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,1] = 0
cv_show('R',cur_img)

在这里插入图片描述

cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,2] = 0
cv_show('G',cur_img)

在这里插入图片描述

cur_img = img.copy()
cur_img[:,:,1] = 0
cur_img[:,:,2] = 0
cv_show('B',cur_img)

在这里插入图片描述
我们可以看出三个通道的效果,此时可能又有疑问,为什么只选取一个通道不是灰度图呢,因为我们现在不能算作真正的把单独的通道取出来,只是把另外的两个通道所有的值置为0了而已,本质上还是按照彩图显示的,那么我们接下来就将彩图的通道直接分离,观察一下效果,分离过程我们需要一个函数
cv2.split函数传进的参数是彩图,执行后会将通道分成bgr三个单通道

b,g,r=cv2.split(img)

不使用函数的话用以下代码也可以实现相同的效果

b,g,r = img[:,:, 0], img[:, :, 1], img[:, :, 2]

那么我们来看一下每个单通道的效果,首先我们用numpy中的函数np.hstack将三个通道合并,然后使用cv2.resize函数改变图片大小,可以更加方便的展示效果

gray_img = np.hstack([b, g, r])
gray_img = cv2.resize(gray_img, (600, 200))
cv_show("gray_img", gray_img)

在这里插入图片描述
可以看到三个灰度图是不同的,因为bgr存储的是不同的对应的通道信息
那么我们再将灰度图放进来做一下展示
在这里插入图片描述
可以看到最左边的是灰度图,右边为bgr的单通道图,他们四个是不一样的,所以灰度化不是单纯的选出其中一个通道,当然很多情况下选出其中一个通道作为灰度图也可以正常应用。

通道合并

我们将bgr用cv2.merge函数合并后可以看到与原图相同,但是如果将其中一个通道扩展到其他通道,即所有通道的值都设置成其中一个通道的值,显示结果依然会是一个灰度的图像,但是这个灰度不是真实的灰度图,他依然是三个通道,只不过三个通道的值完全相同,所以看上去是灰色的而已。

img_bgr=cv2.merge((b, g, r))
img_b=cv2.merge((b, b, b))
img_g=cv2.merge((g, g, g))
img_r=cv2.merge((r, r, r))
img_s = np.hstack([img, img_bgr, img_b, img_g, img_r])
img_s = cv2.resize(img_s, (1000, 200))
cv_show("img_s", img_s)

在这里插入图片描述

3.保存图片

使用cv2.imwrite,传入保存路径和要保存的图片即可保存,我们这里以保存灰度图为例

cv2.imwrite("gray.jpg", gray)

在这里插入图片描述

4.灰图的通道分离

那么问题又来了,如果本身读入的是灰色的图,那么通道分离后的结果是怎么样的呢

gray_img = cv2.imread("gray.jpg")
b, g, r = cv2.split(gray_img)
gray_bgr = np.hstack([b, g, r])
gray_bgr = cv2.resize(gray_bgr, (600, 300))
cv_show("bgr", gray_bgr)

在这里插入图片描述
可以看到,通道完全相同,也就是图片进行灰度处理后已经完全丧失了其他通道的信息了

5.读取视频

在了解图片的读取之后,我们来读取一下视频,首先使用cv2.VideoCapture进行类的实例化,需要的参数是视频的路径,之后调用vc.read读取视频帧。ret为False或者frame为None说明视频读取完成或视频读取失败,退出读取

vc = cv2.VideoCapture('test.mp4')
while open:
    ret, frame = vc.read()
    if frame is None:
        break
    if ret == True:
        cv2.imshow('result', frame)
        if cv2.waitKey(100) & 0xFF == 27:
            break
vc.release()
cv2.destroyAllWindows()

读取灰度化视频

vc = cv2.VideoCapture('test.mp4')

while open:
    ret, frame = vc.read()
    if frame is None:
        break
    if ret == True:
        gray = cv2.cvtColor(frame,  cv2.COLOR_BGR2GRAY)
        cv2.imshow('result', gray)
        if cv2.waitKey(100) & 0xFF == 27:
            break
vc.release()
cv2.destroyAllWindows()

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇

)">
下一篇>>