zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    Java实现 计蒜客 拯救行动
    Java实现 计蒜客 拯救行动
    Java实现 LeetCode 174 地下城游戏
    Java实现 LeetCode 174 地下城游戏
    Java实现 LeetCode 174 地下城游戏
    Java实现 LeetCode 173 二叉搜索树迭代器
    Java实现 LeetCode 173 二叉搜索树迭代器
    Visual Studio的SDK配置
    怎样使用CMenu类
    mfc menu用法一
  • 原文地址:https://www.cnblogs.com/gary-guo/p/6278669.html
Copyright © 2011-2022 走看看