zoukankan      html  css  js  c++  java
  • Python-OpenCV学习(四):基本图像处理

    转载请注明出处:danscarlett的博客园

    参考资料:

    Eddy_zheng.《走进Python-OpenCV:cv2.imread(),cv2.imshow(),cv2.imwrite()》

    xiaoiker《python opencv 图像尺寸变换

    达文西《给深度学习入门者的Python快速教程 - 番外篇之Python-OpenCV》

    目录:

    1. 读取 imread
    2. 显示 imshow
    3. 存储 imwrite
    4. 缩放 resize
    5. 加边框 copyMakeBorder
    6. 裁剪 img[x_start:x_end,y_start:y_end]

    1.图像读取:

    cv2.imread(fileName,flags=None)

    函数功能:读入图像

    参数解释:

    • filename     图像所在此程序的工作路径,或者完整的路径名
    • flag             告诉函数应该如何读取这幅图片。
      • cv2.IMREAD_COLOR或0            读入一副彩色图像。图像的透明度会被忽略,这是默认参数。
      • cv2.IMREAD_GRAYSCALE或1    以灰度模式读图

    例子:

     - 代码:

    # -*- coding: utf-8 -*-
    import cv2
    
    # 灰度图模式加载一副彩图并显示在窗口中
    img1 = cv2.imread('1.jpg',1)
    cv2.imshow('gray',img1)
    cv2.waitKey(0)
    
    # 彩图模式加载一副彩图并显示在窗口中
    img2 = cv2.imread('1.jpg',0)
    cv2.imshow('colorful',img2)
    cv2.waitKey(0)

     - 结果:首先弹出gray窗口,关闭该窗口后,弹出colorful窗口。

     注意:调用opencv,就算图像的路径是错的,OpenCV 也不会提醒你的,但是当你使用命令print img时得到的结果是None。

    # -*- coding: utf-8 -*-
    import cv2
    
    img2 = cv2.imread('2.jpg',2)#文件夹里没有2.jpg
    print(img2)

    输出:


    2.显示图像

    1 cv2.imshow(winname,mat)

    函数功能:显示图像。窗口会自动调整为图像大小。你可以创建多个窗口,只要你喜欢,但是必须给他们不同的名字。

    参数解释:

    • winname    窗口的名字
    • mat             图像对象

    例子:

    - 代码:

    # -*- coding: utf-8 -*-
    import cv2
    
    img2 = cv2.imread('1.jpg')
    cv2.imshow('image',img2)
    
    cv2.waitKey(0)
    # cv2.waitKey() 是一个键盘绑定函数。需要指出的是它的时间尺度是毫
    # 秒级。函数等待特定的几毫秒,看是否有键盘输入。特定的几毫秒之内,如果
    # 按下任意键,这个函数会返回按键的ASCII 码值,程序将会继续运行。如果没
    # 有键盘输入,返回值为-1,如果我们设置这个函数的参数为0,那它将会无限
    # 期的等待键盘输入。它也可以被用来检测特定键是否被按下,例如按键a 是否
    # 被按下,这个后面我们会接着讨论。
    
    cv2.destroyAllWindows()
    # cv2.destroyAllWindows() 可以轻易删除任何我们建立的窗口。如果
    # 你想删除特定的窗口可以使用cv2.destroyWindow(),在括号内输入你想删
    # 除的窗口名。

     - 结果:


    3.保存图像

    cv2.imwrite(filename,img,params=None)

    函数功能:将图像保存到指定的文件。

    参数:

    • filename    文件名称
    • image        需要存储的图像文件
    • params      存储的格式或者编码
      • CV_IMWRITE_JPEG_QUALITY   对于JPEG文件,质量用0-100标记,默认值为95.

      • CV_IMWRITE_PNG_COMPRESSION 对于PNG文件,压缩级别用0-9表示,较高的值意味着较小的尺寸和较长的压缩时间,默认值为3.

      • CV_IMWRITE_PXM_BINARY    对于PPM、PGM或者PBM文件,这是二进制格式标识(0或1)。默认值为1。

    例子:

    - 代码

    # -*- coding: utf-8 -*-
    import cv2
    
    img = cv2.imread('1.jpg')
    
    #将原图存储到另一个文件中
    cv2.imwrite('2.jpg',img)
    img2 = cv2.imread('2.jpg')
    cv2.imshow('copy',img2)
    cv2.waitKey(0)
    
    #将原图的10%质量存储到jpg
    cv2.imwrite('3.jpg',img,(cv2.IMWRITE_JPEG_QUALITY,10))
    img3 = cv2.imread('3.jpg')
    cv2.imshow('JPG',img3)
    cv2.waitKey(0)
    
    #将原图压缩率9/10存储到PNG
    cv2.imwrite('4.png',img,(cv2.IMWRITE_PNG_COMPRESSION,9))
    img4 = cv2.imread('4.png')
    cv2.imshow('PNG',img4)
    cv2.waitKey(0)

    - 结果:

    copy

    JPG

    PNG


    4.图像缩放

    cv2.resize(src,dst,fx=None,fy=None,interpolation=None)

    函数功能:缩放图片

    参数:

    • src                  源文件
    • dst                  目标文件
    • fx                    x方向上的像素
    • fy               y方向上的像素
    • interpolation   变换的方法
      •   CV_INTER_NN          最近邻插值,  
      •   CV_INTER_LINEAR  双线性插值 (缺省使用)  
      •      CV_INTER_AREA    使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 CV_INTER_NN 方法..  
      •   CV_INTER_CUBIC     立方插值

     例子:

    - 代码:

    # -*- coding: utf-8 -*-
    import cv2
    
    img = cv2.imread('1.jpg')
    
    #  缩放成200*200的图像
    # 插值方法默认是cv2.INTER_LINEAR,这里指定为最近邻插值
    img2 = cv2.resize(img,(200,200))
    
    # 不直接指定缩放后大小,通过fx和fy指定缩放比例,0.5则长宽都为原来一半
    # 注意指定大小的格式是(宽度,高度)
    img3 =cv2.resize(img,(0,0),fx=0.5,fy=0.5,interpolation=cv2.INTER_NEAREST)
    
    print('img.shape=',img.shape)
    print('img2.shape=',img2.shape)
    print('img3.shape=',img3.shape)

    - 结果:


    5.添加边框

    cv2.copyMakeBorder(src,top,bottom,left,right,borderType,dst=None,value=None)

    函数功能:复制图像并加上边界

    参数:

    • src                            源图像
    • top,bottem,left,right  分别表示四个方向上边界的长度
    • borderType          边界的类型
      •        BORDER_REFLICATE    直接用边界的颜色填充, aaaaaa | abcdefg | gggg
      •   BORDER_REFLECT    倒映,abcdefg | gfedcbamn | nmabcd
      •   BORDER_REFLECT_101    倒映,和上面类似,但在倒映时,会把边界空开,abcdefg | egfedcbamne | nmabcd
      •   BORDER_WRAP       类似于这种方式abcdf | mmabcdf | mmabcd
      •   BORDER_CONSTANT      常量,增加的变量通通为value色 [value][value] | abcdef | [value][value][value]
    • value                          仅仅是常量型边界才有意义

    例子:

    - 代码:

    # -*- coding: utf-8 -*-
    import cv2
    import numpy as np
    
    img = cv2.imread('1.jpg')
    BLUE = [255,0,0]
    
    img2 = cv2.copyMakeBorder(img,10,10,10,10,borderType=cv2.BORDER_CONSTANT,dst=None,value=BLUE)
    cv2.imshow("img2",img2)
    cv2.waitKey(0)

    - 结果:


    6.裁边

    直接看例子:

    # -*- coding: utf-8 -*-
    import cv2
    import numpy as np
    
    img = cv2.imread('1.jpg')
    BLUE = [255,0,0]
    img2 = cv2.copyMakeBorder(img,10,10,10,10,borderType=cv2.BORDER_CONSTANT,dst=None,value=BLUE)
    
    #加入边框之后的图像大小:(552, 820),
    # 裁剪出坐标在10-542,10-810之间的像素
    img3 = img2[10:542,10:810]
    
    cv2.imshow("img3",img3)
    cv2.waitKey(0)

    结果:

  • 相关阅读:
    Linux mii-tool 命令
    MySQL 主从复制
    MySQL 备份与恢复
    SOAP 版本可能不匹配: 出现意外的 Envelope 命名空间 http://schemas.xmlsoap.org/wsdl/
    网管邮件配置
    ORA-10873
    Exception in thread "main" java.lang.UnsatisfiedLinkError:
    安装 ORACLE 11G出现Error Message:PRVF-7535
    mount /dev/sr0 /media/cdrom you must specify the filesystem type
    NBU 还原windows ORACLE数据库(BW)
  • 原文地址:https://www.cnblogs.com/danscarlett/p/7156635.html
Copyright © 2011-2022 走看看