美文网首页OpenCvOpenCVOpenCV with Python By Example
计算机视觉实战(二)图像基本操作

计算机视觉实战(二)图像基本操作

作者: 小小何先生 | 来源:发表于2019-12-12 14:45 被阅读0次

      本文主要介绍OpenCv对图像的一些基本处理。包括图片、视频读取,读取感兴趣窗口,通道分离与合并,边界填充,直接对像素点进行操作,以及两张图片的融合。

    图片的读取

      读取图片是OpenCv最基本的功能,实现起来也比较简单,调用cv2.imread()函数即可实现:

    import cv2
    import matplotlib.pyplot as plt
    import numpy as np
    img = cv2.imread('cat.jpg') # opencv默认读取BGR格式
    print(img)
    # 显示图像,可以创建多个窗口
    cv2.imshow('Cat', img)
    # 等待,0表示键盘任意键终止,如果为1000代表1000毫秒结束显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

      这里读取一张猫的图片为例,结果显示:

    读取猫的图片结果显示

      如果我们需要查看图像的维度,我们可以通过以下代码进行查看:

    print(img.shape)
    

      如果我们需要读取灰度图片的话,我们可以采用以下的方式,添加一个参数即可:

    img = cv2.imread('cat.jpg', cv2.IMREAD_GRAYSCALE)
    

      我们也可以通过以下方式将其保存起来。

    print(img.size) #查看像素点的个数
    

      依次查看图片的维度和像素点个数:

    print输出显示结果

    视频的读取:

      OpenCv读取视频的大体的思路就是:先判断一下这个视频能不能打开,如果能打开就循环读取里面的每一帧数据,也就是每一张图片,之后你就可以对每一张图片做一些处理,之后显示出来:

    import cv2
    vc = cv2.VideoCapture('chaplin.mp4')
    # 判断是否能够读取视频
    if vc.isOpened():
        open, frame = vc.read()
    else:
        open =False
    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()
    

      结果会将这个视频显示在OpenCV的窗口之中,左上角的"result"很好地验证了这个结果:

    视频结果显示

    读取感兴趣的窗口:

      有时候,我们只希望读取读取一张图片中的某部分窗口,我们称之为感兴趣的窗口,这种研究也是蛮重要的,之后神经网络里面的注意力机制就是依据这个思想发展出来的。

    import cv2
    img = cv2.imread('cat.jpg')
    img2 = img[50:200, 100:400] # 切片读取感兴趣的区域
    cv2.imshow('cat',img2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()/
    

      我们把之前那只猫做处理,读取它的感兴趣区域,结果显示如下:

    感兴趣窗口

    通道分离与合并

      我们知道图像由于要表示颜色,而三原色(红、绿、蓝)能够组成任何的颜色,所以图像也就是由不同的三原色组成的,每一个三原色都是一个通道,虽然说以后的卷积神经网络里面的通道不断增加(卷积核个数)。考虑最基本的三原色,我们可以通过以下的方式将其通道分开:

    img = cv2.imread('cat1.jpg')
    b, g, r = cv2.split(img)
    

      也可以将其合并起来:

    img1 = cv2.merge((b, g, r))
    

      如果只看一个通道的,比如来看一下红色通道的:

    import cv2
    img = cv2.imread('cat1.jpg')
    b, g, r = cv2.split(img)
    img1 = cv2.merge((b, g, r))
    cv2.imshow('cat_1', img1)
    cop_img = img1.copy()
    cop_img[:,:,0] = 0
    cop_img[:,:,1] = 0
    cv2.imshow('cat_only_r', cop_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

      其结果显示如下所示:

    红色通道的猫与原图对比

    边界填充

      在卷积操作中经常需要边界填充padding,所谓的边界填充就是在图像边界填充处填充一圈像素,你可以全部填充白色的像素、或者黑色的像素、或者把边界的像素进行复制再填充过去等等。

    import cv2
    top_size, bottom_size, left_size, right_size = (50, 50, 50, 50)
    img = cv2.imread('cat1.jpg')
    replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
    reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_REFLECT)
    reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
    wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
    constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_CONSTANT, value=0)
    import matplotlib.pyplot as plt
    plt.subplot(231), plt.imshow(img, 'gray'), plt.title('ORIGINAL')
    plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('REPLICATE')
    plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('REFLECT')
    plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('REFLECT_101')
    plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP')
    plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('CONSTANT')
    plt.show()
    

      其效果显示如下所示:

    边界填充效果图

    numerical calculation

      对像素点直接进行加减。

    img_cat = cv2.imread('cat.jpg')
    img_cat_add = img_cat + 10
    

      其结果显示如下:

    在这里插入图片描述

      我们也可以改变另一张图像的大小,之后将两张一样大小的图片进行融合:

    img_cat = cv2.imread('cat.jpg')
    img_cat_resize = cv2.resize(img_cat, (300, 500))
    

      变化完成之后,可以对其进行融合了:

    import cv2
    img_cat = cv2.imread('cat.jpg')
    img_dog = cv2.imread('dog.jpg')
    print('img_cat size',img_cat.shape)
    print('img_dog size', img_dog.shape)
    img_dog_resize = cv2.resize(img_dog, (550, 366))
    print('img_dog_resize', img_dog_resize.shape)
    res = cv2.addWeighted(img_cat, 0.3, img_dog_resize, 0.9, 0)
    cv2.imshow('366*550',res)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    融合后的结果

    我的微信公众号名称:深度学习与先进智能决策
    微信公众号ID:MultiAgent1024
    公众号介绍:主要研究分享深度学习、机器博弈、强化学习等相关内容!期待您的关注,欢迎一起学习交流进步!

    相关文章

      网友评论

        本文标题:计算机视觉实战(二)图像基本操作

        本文链接:https://www.haomeiwen.com/subject/ypktnctx.html