• 3、图片处理


    1、目标

    a、在这里将会学到怎样读取一副图像,怎样显示幅图像,以及如何保存一副图像

    b、要学习的函数如下:

    cv2.imread(),cv2.imshow(),cv2.imwrite()

    c、还可以使用Matplotlib显示一幅图片

    2、读入一幅图像

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

    3、保存一幅图像

    4、总结

    下面的程序将会加载一个灰度图,显示图片,按下’s’键保存后退出,或者
    按下 ESC 键退出不保存。

    5、使用Matplotlib

    Matplotib 是 python 的一个绘图库,里头有各种各样的绘图方法。之后
    会陆续了解到。现在,你可以学习怎样用 Matplotib 显示图像。你可以放大图
    像,保存它等等。

    参见:Matplotib 有多种绘图选择。具体可以参见 Matplotib docs。我们也
    会陆续了解一些

    注意:彩色图像使用 OpenCV 加载时是 BGR 模式。但是 Matplotib 是 RGB
    模式。所以彩色图像如果已经被 OpenCV 读取,那它将不会被 Matplotib 正
    确显示。具体细节请看练习

    附加资源:
    Matplotlib Plotting Styles and Features

    http://matplotlib.org/api/pyplot_api.html

    练习:
    1. 当你用 OpenCV 加载一个彩色图像,并用 Matplotib 显示它时会遇
    到一些困难。请阅读this discussion并且尝试理解它。

    在opencv中彩色图的顺序是BGR,而在matplotlib中彩色图的顺序是RGB,如何相互转换,

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    
    img = cv2.imread('messi4.jpg')
    b,g,r = cv2.split(img)
    img2 = cv2.merge([r,g,b])
    plt.subplot(121);plt.imshow(img) # expects distorted color
    plt.subplot(122);plt.imshow(img2) # expect true color
    plt.show()
    
    cv2.imshow('bgr image',img) # expects true color
    cv2.imshow('rgb image',img2) # expects distorted color
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    NB : Please check @Amro 's comment below for better method of conversion between BGR and RGB. img2 = img[:,:,::-1] . Very simple.

    Run this code and see the difference in result yourself. Below is what I got :

    补充:

    1、用cv2.imshow显示图像,这种方式显示的窗口无法调整,当显示的图像较大时,就无法看到完整的图像,因此选择先创建窗口再显示图像。

    1. import cv2 
    2.  
    3. img = cv2.imread('lena.jpg') 
    4.  
    5. win = cv2.namedWindow('test', flags=0) 
    6.  
    7. cv2.imshow('test', img) 
    8.  
    9. cv2.waitKey(0) 

    OpenCV采用窗口名称来访问窗口,而不是窗口句柄之类的东西。

    flags为0表示窗口可以用鼠标来改变大小,此时显示的图像也跟着窗口大小变化,需要注意的是它可能会导致图像的变形:

    2、matplotlib图像显示

    1. mport cv2  
    2. import matplotlib.pyplot as plt  
    3.   
    4. img = cv2.imread('lena.jpg')  
    5. plt.imshow(img)  
    6. plt.show()  

     颜色有问题,下面将第1通道和第3通道交换后显示:

    1. import numpy as np  
    2. import cv2  
    3. import matplotlib.pyplot as plt  
    4.   
    5. img = cv2.imread('lena.jpg')  
    6. (r, g, b)=cv2.split(img)  
    7. img=cv2.merge([b,g,r])  
    8.   
    9. plt.imshow(img)  
    10. plt.show()  

    就正常了

    3、用plt读取图像

    再比较一下plt.imread和cv2.imread的差别:

    1. import numpy as np  
    2. import cv2  
    3. import matplotlib.pyplot as plt  
    4.   
    5. img1 = cv2.imread('lena.jpg')  
    6. img2 = plt.imread('lena.jpg')  
    7.   
    8. plt.subplot(121)  
    9. plt.imshow(img1)  
    10.   
    11. plt.subplot(122)  
    12. plt.imshow(img2)  
    13.   
    14. plt.show()  

    上述代码读取同一张图像并用相同的方法显示,差异还是在颜色通道上:

    4、matplotlib显示灰度图

    对于只有一个颜色通道的图像,matplotlib可以指定一个map,将单个颜色通道的图像转换为彩色图像。

    matplotlib支持下面的map。

  • 相关阅读:
    restore db fail
    MAC 设置环境变量path的常用方法
    python编码问题 decode与encode
    python 正则表达式 提取网页中标签的中文
    转:Linux实时将所有输出重定向到文件
    selenium 定位无标签的元素
    re.compile
    Python urllib.quote
    Shell #*/ 和 %/*
    [转载] python必碰到的问题---encode与decode,中文乱码
  • 原文地址:https://www.cnblogs.com/gary-guo/p/6278669.html
Copyright © 2020-2023  润新知