zoukankan      html  css  js  c++  java
  • 图像的基本操作

    注意:一下代码均在jyputer notebook上执行,所以换IDE可能要换一下代码。

    图像

    cv2.IMREAD_COLOR # 彩色图像,默认
    cv2.IMREAD_GRAYSCALE # 灰度图像
    • 读取一个彩色图像

    import cv2 # opencv读取的格式是BGR
    
     
    img=cv2.imread('1.jpg') # 读取图像
     
    def cv_show(name,img): # 通过一个函数来显示图像
        cv2.imshow('name',img)
        cv2.waitKey(0) #等待时间,毫秒级,0表示任意键终止
        cv2.destroyAllWindows()
     
    cv_show(img,img)
    View Code
    • 读取一个灰度图像

    import cv2
    
    
    img=cv2.imread('1.jpg',cv2.IMREAD_GRAYSCALE) # 指定图像格式为灰度
    
    def cv_show(name,img):
        cv2.imshow('name',img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    
    cv_show(img,img)
    View Code
    • 显示像素值

    import cv2
    
    
    img=cv2.imread('1.jpg')
    img
    View Code
    array([[[162, 167, 170],
            [162, 167, 170],
            [162, 167, 170],
            ...,
            [163, 166, 170],
            [163, 166, 170],
            [163, 166, 170]],
    
           [[162, 167, 170],
            [162, 167, 170],
            [162, 167, 170],
            ...,
            [163, 166, 170],
            [163, 166, 170],
            [163, 166, 170]],
    
           [[161, 166, 169],
            [161, 166, 169],
            [161, 166, 169],
            ...,
            [162, 165, 169],
            [162, 165, 169],
            [162, 165, 169]],
    
           ...,
    
           [[194, 192, 182],
            [194, 192, 182],
            [194, 192, 182],
            ...,
            [173, 177, 182],
            [171, 175, 180],
            [171, 174, 178]],
    
           [[194, 192, 182],
            [194, 192, 182],
            [194, 192, 182],
            ...,
            [173, 177, 182],
            [171, 175, 180],
            [171, 174, 178]],
    
           [[194, 192, 182],
            [194, 192, 182],
            [194, 192, 182],
            ...,
            [173, 177, 182],
            [171, 175, 180],
            [171, 174, 178]]], dtype=uint8)
    彩色图像像素值输出,三通道
    array([[167, 167, 167, ..., 167, 167, 167],
           [167, 167, 167, ..., 167, 167, 167],
           [166, 166, 166, ..., 166, 166, 166],
           ...,
           [189, 189, 189, ..., 178, 176, 175],
           [189, 189, 189, ..., 178, 176, 175],
           [189, 189, 189, ..., 178, 176, 175]], dtype=uint8)
    灰度图像像素值输出,单通道
    • 保存图像

    cv2.imwrite('1.png',img) # 可以改变图片后缀
    • 打印图像的类型

    type(img)

     numpy.ndarray 

    • 打印图像的大小

    img.size

     1454418 

    • 打印图像的数据类型

    img.dtype

     dtype('uint8') 

    • 打印图像的shape

    img.shape

     (1358, 1071) 这是灰度图像的,如果是彩色图像,输出就是 (1358, 1071, 3) 

    • 截取部分图像数据

    import cv2 as cv
    
    
    img = cv.imread('1.jpg')
    part = img[0:50, 0:200] # 截取图片操作
    cv.imshow('img', img) # 显示原始图
    cv.imshow('part_img', part) # 显示被截取图
    cv.waitKey(0)
    cv.destroyAllWindows()
    View Code
    • 颜色通道提取

    import cv2 as cv
    
    
    img = cv.imread('1.jpg')
    b, g, r = cv.split(img) # 将一张图片切分成三个通道
    b # 显示b通道
    
    # output
    # array([[162, 162, 162, ..., 163, 163, 163],
    #       [162, 162, 162, ..., 163, 163, 163],
    #       [161, 161, 161, ..., 162, 162, 162],
    #       ...,
    #       [194, 194, 194, ..., 173, 171, 171],
    #       [194, 194, 194, ..., 173, 171, 171],
    #       [194, 194, 194, ..., 173, 171, 171]], dtype=uint8)
    提取其中一个通道
    cv.merge((b, g, r))
    将三个通道合并
    import cv2 as cv
    
    
    img = cv.imread('1.jpg')
    cur_img = img.copy() # 复制图片
    cur_img[:, :, 0] = 0 # 将B通道全部设置为0
    cur_img[:, :, 1] = 0 # 将G通道全部设置为0
    cv.imshow('cur_img', cur_img) # 只保留R通道
    cv.waitKey(0)
    cv.destroyAllWindows()
    只保留某个通道,并显示
    • 边界填充

    import cv2 as cv
    import matplotlib.pyplot as plt
    
    
    img = cv.imread('2.jpg')
    
    top_size, bottom_size, left_size, right_size = (50, 50, 50, 50) # 设置上下左右填充的长度
    
    replicate = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType = cv.BORDER_REPLICATE) # 填充类型为BORDER_REPLICATE,先复制img,再make,borderType可不写
    reflect = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_REFLECT) # 填充类型为BORDER_REFLECT
    reflect_101 = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_REFLECT_101) # 填充类型为BORDER_REFLECT_101
    wrap = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_WRAP) # 填充类型为BORDER_WRAP
    constant = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv.BORDER_CONSTANT, value = 0) # 填充类型为BORDER_CONSTANT,填充值为0,黑色
    
    # plt.subplot(331):将划分成3*3九个区域,1表示图片中左上角,第一个块中
    plt.subplot(331), plt.imshow(img, 'gray'), plt.title('ORIGIN')
    plt.subplot(332), plt.imshow(replicate, 'gray'), plt.title('REPLICATE')
    plt.subplot(333), plt.imshow(reflect, 'gray'), plt.title('REFLECT')
    plt.subplot(337), plt.imshow(reflect_101, 'gray'), plt.title('REFLECT_101')
    plt.subplot(338), plt.imshow(wrap, 'gray'), plt.title('WRAP')
    plt.subplot(339), plt.imshow(constant, 'gray'), plt.title('CONSTANT')
    
    plt.show()
    五种边界填充
    1. BORDER_REPLICATE:复制法,也就是复制最边缘的像素
    2. BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制。例如:dcba|abcd|dcba
    3. BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称。例如:dcb|abcd|cba
    4. BORDER_WRAP:外包装法。例如:abcd|abcd|abcd
    5. BORDER_CONSTANT:常量法,常数值填充。

    • 数值计算

    import cv2 as cv
    
    
    img = cv.imread('1.jpg')
    img[:5, :, 0] # 输出前第0层的前五行
    先输出img的值 

     array([[162, 162, 162, ..., 163, 163, 163], [162, 162, 162, ..., 163, 163, 163], [161, 161, 161, ..., 162, 162, 162], [161, 161, 161, ..., 162, 162, 162], [161, 161, 161, ..., 162, 162, 162]], dtype=uint8) 

    img2[:5, :, 0]
    再输出img2的值

     array([[172, 172, 172, ..., 173, 173, 173], [172, 172, 172, ..., 173, 173, 173], [171, 171, 171, ..., 172, 172, 172], [171, 171, 171, ..., 172, 172, 172], [171, 171, 171, ..., 172, 172, 172]], dtype=uint8) 

    (img + img2)[:5, :, 0] # 以第一个值为例,162+172=334,然后334%256=78,如果两数相加超过了0-255,256个值,就取余。
    img,img2相加——方式1

     array([[78, 78, 78, ..., 80, 80, 80], [78, 78, 78, ..., 80, 80, 80], [76, 76, 76, ..., 78, 78, 78], [76, 76, 76, ..., 78, 78, 78], [76, 76, 76, ..., 78, 78, 78]], dtype=uint8) 

    cv.add(img, img2)[:5, :, 0] # 这个函数也是相加,但是只要相加的值超过255,就取255,没有超过就取最大值
    img,img2相加——方式2

     array([[255, 255, 255, ..., 255, 255, 255], [255, 255, 255, ..., 255, 255, 255], [255, 255, 255, ..., 255, 255, 255], [255, 255, 255, ..., 255, 255, 255], [255, 255, 255, ..., 255, 255, 255]], dtype=uint8) 

    • 图像融合(包含resize的使用)

    import cv2 as cv
    import matplotlib.pyplot as plt
    
    
    cat = cv.imread('cat.jpg')
    dog = cv.imread('dog.jpg')
    print(cat.shape, dog.shape) # 猫的shape是(414, 500, 3),狗的shape是(429, 499, 3),明显不一样,不能融合
    
    dog = cv.resize(dog, (500, 414)) # 将狗的shape改成和猫的一样
    
    res = cv.addWeighted(cat, 0.4, dog, 0.6, 0) # 参考公式“R=αx+βy+b",cat是x,0.4是α,dog是y,0.6是β,0是偏置项b。
    plt.subplot(131), plt.imshow(cat)
    plt.subplot(132), plt.imshow(dog)
    plt.subplot(133), plt.imshow(res)
    融合操作

    import cv2 as cv
    import matplotlib.pyplot as plt
    
    
    cat = cv.imread('cat.jpg')
    cat1 = cv.resize(cat, (0, 0), fx = 1, fy = 3)
    cat2 = cv.resize(cat, (0, 0), fx = 3, fy = 1)
    plt.subplot(131), plt.imshow(cat)
    plt.subplot(132), plt.imshow(cat1)
    plt.subplot(133), plt.imshow(cat2)
    resize的另外一种使用方式

    读取视频

    • 读取视频并处理成灰度图像

    import cv2 as cv
    
    
    v = cv.VideoCapture('run.mp4')
    # 检查是否打开正确
    if v.isOpened():
        open, frame = v.read() # open是一个bool值,frame代表一帧一帧的读取视频
    else:
        open = False
    # 进行视频操作
    while open:
        ret, frame = v.read()
        if frame is None:
            break
        if ret == True:
            gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) # 将每一帧转换为灰度
            cv.imshow('video', gray)
            if cv.waitKey(10) & 0xFF == 27: # cv.waitKey()里面的值可以控制播放速度,27指的是按下退出键就可以跳出循环,一般都指定27
                break
    v.release()
    cv.destroyAllWindows()
    View Code
  • 相关阅读:
    ie下如果已经有缓存,load方法的效果就无法执行.的解决方法
    css公共样式
    pageX、pageY全兼容
    js滚动加载插件
    getComputedStyle()与currentStyle
    excel15个技巧
    XMLHttpRequest函数
    继承模式
    cookie函数
    jQuery添加删除元素
  • 原文地址:https://www.cnblogs.com/missdx/p/12348844.html
Copyright © 2011-2022 走看看