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。

 

posted on 2017-01-12 16:08  gary_123  阅读(671)  评论(0编辑  收藏  举报

导航