zoukankan      html  css  js  c++  java
  • 01_opencv_python_基本图像处理

    1  图像基本操作

     

    1.0.1  环境配置地址:

    1.1  数据读取-图像

    • cv2.IMREAD_COLOR:彩色图像
    • cv2.IMREAD_GRAYSCALE:灰度图像
    import cv2  # opencv读取的格式是BGR
    import matplotlib.pyplot as plt
    import numpy as np 
    %matplotlib inline 
    
    # img读入的本质上就是数组 img
    = cv2.imread('cat.jpg')
    #图像的显示,也可以创建多个窗口
    cv2.imshow('image',img) 
    # 等待时间,毫秒级,0表示任意键终止
    cv2.waitKey(0) 
    cv2.destroyAllWindows()

    我们来将上述图像显示的代码封装成一个函数

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

    我们可以看看图像的各种基本信息

    print(img.shape)  # 图片形状(h, w, c)
    
    # 读取灰度图 -->通道数 c == 1
    img=cv2.imread('cat.jpg',cv2.IMREAD_GRAYSCALE)
    img
    
    # 看看图片的类型  numpy.ndarray
    type(img)
    
    # 图片的size = h * w * c
    img.size
    
    # 图片中数据的类型 比如uint8 float32
    img.dtype

    保存图片

    # ('路径/保存图片名字', 要保存的图片)
    cv2.imwrite('mycat.png', img)  

    1.2  数据读取-视频

    • cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备,例如0,1。
    • 如果是视频文件,直接指定好路径即可。
    vc = cv2.VideoCapture('test.mp4')
    # 检查是否打开正确
    if vc.isOpened(): 
        oepn, 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()

    1.3  录制视频

    import cv2#导入opencv包
     
    video=cv2.VideoCapture(0)#打开摄像头
     
    fourcc = cv2.VideoWriter_fourcc(*'XVID')#视频存储的格式
    fps = video.get(cv2.CAP_PROP_FPS)#帧率
    #视频的宽高
    size = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)), 
            int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))
    out = cv2.VideoWriter('video.avi', fourcc, fps, size)#视频存储
     
    while out.isOpened():
        ret,img=video.read()#开始使用摄像头读数据,返回ret为true,img为读的图像
        if ret is False:#ret为false则关闭
            exit()
        cv2.namedWindow('video',cv2.WINDOW_AUTOSIZE)#创建一个名为video的窗口
        cv2.imshow('video',img)#将捕捉到的图像在video窗口显示
        out.write(img)#将捕捉到的图像存储
        #按esc键退出程序
        if cv2.waitKey(1) & 0xFF ==27:
            video.release()#关闭摄像头
            break

    1.4  截取部分图像数据

    img=cv2.imread('cat.jpg')
    
    cat=img[0:100,0:200]
    cv_show('cat',cat)

    1.5  色彩空间API

    def color_space_demo(src):
        img = cv2.imread(src)
        # 转成灰度图
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        cv_show("gray", gray)
        # 转成HSV
        hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
        cv_show('hsv', hsv)
        # hsv转成rgb(bgr)
        img = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
        cv_show('hcv2img', img)
        # yuv...也可以转

    1.5.1  基于颜色提出目标(先转成hsv格式)

     

    def extrace_object_demo(src):
        img = cv2.imread(src)  # 通道数是3
        # print(img.shape)
        img_binary = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 通道数是 1
        # print(img_binary.shape)
        
        # 1.将RGB转换成HSV色彩空间
        hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
        # print(hsv.shape)
        
        # 2.定义数组,说明你要提取(过滤)的颜色目标
        # 三通道,所以是三个参数
        # 红色
        lower_hsv_r = np.array([156, 43, 46])
        upper_hsv_r = np.array([180, 255, 255])   
        
        # 3.进行过滤,提取,得到二值图像
        mask_red = cv2.inRange(hsv, lower_hsv_r, upper_hsv_r)  # 通道数是 1 
        # print(mask_red.shape)
        
        # 4.展示成果
        cv_show('original', img)
        cv_show('mask_red', mask_red)
        
        # 5.合并展示
        res = np.hstack((img_binary, mask_red))
        cv_show("hastck", res)
        
        return mask_red

    1.6  颜色通道提取与合并

    # 提取
    b,g,r=cv2.split(img)
    print(b.shape)
    # 合并
    img = cv2.merge((b,g,r))
    print(img.shape)
    # 只保留R
    cur_img = img.copy()
    cur_img[:,:,0] = 0
    cur_img[:,:,1] = 0
    cv_show('R',cur_img)

    1.7  边界填充

    • BORDER_REPLICATE:复制法,也就是复制最边缘像素。
    • BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
    • BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
    • BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg
    • BORDER_CONSTANT:常量法,常数值填充。
    top_size,bottom_size,left_size,right_size = (50,50,50,50)
    
    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()

    1.8  图像融合

    必须保证要融合的图片shape一致

    img_cat=cv2.imread('cat.jpg')
    img_dog=cv2.imread('dog.jpg')
    
    img_cat + img_dog
    # ValueError: operands could not be broadcast together with shapes (414,500,3) (429,499,3) 
    
    # 将狗狗的图片和猫猫的图片resize一样
    img_dog = cv2.resize(img_dog, (500, 414))
    
    # 选择融合的权重
    res = cv2.addWeighted(img_cat, 0.4, img_dog, 0.6, 0)
    
    # 展示结果
    plt.imshow(res)

    进一步演示resize的用法

    # 将猫猫的图片放大
    res = cv2.resize(img, (0, 0), fx=4, fy=4)
    plt.imshow(res)

    res = cv2.resize(img, (0, 0), fx=1, fy=3)
    plt.imshow(res)

  • 相关阅读:
    结构体中的冒号_转
    随机数产生random
    gdb调试段错误及使用
    gcc选项-g与-rdynamic的异同_转
    linux设备模型_转
    boost 1.57.0安装
    技术的正宗与野路子_转
    (转)Java里的堆(heap)栈(stack)和方法区(method)(精华帖,多读读)
    (转)面试大总结之一:Java搞定面试中的链表题目
    (转)类加载器与双亲委派模型
  • 原文地址:https://www.cnblogs.com/kongweisi/p/11555438.html
Copyright © 2011-2022 走看看