1. 程式人生 > >OpenCV——圖片的載入、顯示、儲存(python)

OpenCV——圖片的載入、顯示、儲存(python)

本小節,我們將學習在Python語言中利用OpenCV庫來實現圖片的讀取、顯示、儲存,所有的這些圖片都是一個numpy.ndarray,這三種操作都過cv2.imread()、cv2.imshow()、cv2.imwrite()三個函式來實現,同時在文末,簡要介紹了使用Matplotlib來顯示圖片。本文所使用opencv為opencv3.2版本,圖片如下:

這裡寫圖片描述

1. 讀取圖片

在OpenCV中使用cv2.imread()函式來載入圖片,該函式的形式如下:

cv2.imread(path, flags)

引數意義如下:

  • path: 該引數制定圖片的路徑,可以使用相對路徑,也可以使用絕對路徑;
  • flags:指定以何種方式載入圖片,有三個取值:
    1. cv2.IMREAD_COLOR:讀取一副彩色圖片,圖片的透明度會被忽略,預設為該值,實際取值為1;
    2. cv2.IMREAD_GRAYSCALE:以灰度模式讀取一張圖片,實際取值為0
    3. cv2.IMREAD_UNCHANGED:載入一副彩色影象,透明度不會被忽略。

如果給定的圖片路徑不對,該函式不會丟擲異常,而是返回一個None,如果給定正確的圖片路徑,將返回一個[height, width, channel]的numpy.ndarray物件,height表示圖片高度,width表示圖片寬度,channel表示圖片的通道。

import
numpy as np import cv2 img = cv2.imread("pic.jpg") # img = cv2.imread("pic.jpg", cv2.IMREAD_COLOR) # img = cv2.imread("pic.jpg", cv2.IMREAD_GRAYSCALE) # img = cv2.imread("pic.jpg", cv2.IMREAD_UNCHANGED) cv2.imshow("image", img) # 顯示圖片,後面會講解 cv2.waitKey(0) #等待按鍵

效果如下:

這裡寫圖片描述 這裡寫圖片描述 這裡寫圖片描述
cv2.IMREAD_COLOR cv2.IMREAD_GRAYSCALE cv2.UNCHANGED

2. 顯示圖片

使用cv2.imshow()函式在一個視窗中顯示圖片,這個視窗自適應圖片的大小,其形式如下:

cv2.imshow(winname, mat)

引數意義如下:

1. winame:一個字串,表示建立的視窗名字,每一個視窗必須有一個唯一的名字;
2. mat:是一個圖片矩陣,numpy.ndarray型別

在圖片顯示的過程中,通常會伴隨幾個其他的函式,他們分別是:

  • cv2.waitKey()
  • cv2.destroyAllWindows()
  • cv2.destroyWindow()
  • cv2.namedWindow()

因為我們的程式是順序執行,如果沒有cv2.waitKey()函式,影象不會顯示(也許是一閃而過,我們人眼觀察不到),cv2.waitKey()函式是一個鍵盤繫結函式(相當於讓程式在這裡掛起暫停執行),他接受一個單位為毫秒的時間,它等待指定時間的鍵盤事件,在指定時間內發生了鍵盤事件,程式繼續執行,否則必須等到時間結束才能繼續執行,引數如果為0表示等待無限長的事件。

cv2.destroyAllWindows()用來銷燬所有已經建立的視窗, 如果需要銷燬指定視窗使用cv2.destroyWindow()函式,他接受一個表示視窗名字的名字。

在這裡我們直接用cv2.imshow()建立的視窗是自動適應圖片大小的,不能縮放,如果我們想放大縮小視窗,必須單獨用cv2.namedWindow(),並通過flag引數指定視窗模式為cv2.WINDOW_NORMAL,預設為cv2.WINDOW_AUTOSIZE.

下面是一個視窗可以發達縮小的顯示圖片的例子:

import numpy as np
import cv2

img = cv2.imshow('picture.jpg')
cv2.namedWindow('image')
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. 儲存圖片

使用cv2.imwrite()函式來儲存圖片,形式如下:

cv2.imwrite(filename, img)

引數意義如下:

  • filename: 儲存檔案的路徑名
  • img: 表示影象的numpy.ndarray物件

4. 一個完整程式

import numpy as np
import cv2

img = cv2.imread('messi5.jpg',0)
cv2.imshow('image',img)
k = cv2.waitKey(0)
## k = cv2.waitKey(0) & 0xFF  # 64位機器
if k == 27:         # 按下esc時,退出
    cv2.destroyAllWindows()
elif k == ord('s'): # 按下s鍵時儲存並退出
    cv2.imwrite('messigray.png',img)
    cv2.destroyAllWindows()

5. 使用matplotlib顯示圖片

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('messi5.jpg',0)
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([])  # 隱藏x、y軸
plt.show()

因為opencv以BGR模式載入圖片,而matplotlib以RGB模式顯示圖片,所以用opencv載入的彩色圖片,在matplotlib中不能正確顯示,解決方案

6. C++語法

以上都是在python語言中的介紹,用C++語言其實採用同樣的函式,只是寫法不一樣而已,比如:

import cv2 -> inclue<opencv2/core/core2.hpp>
cv2.imread() -> cv2::imread()
cv2.imshow() -> cv2::imshow()
cv2.imwrite() -> cv2::imwrite()

參考資料