OpenCV-Python——圖片的加載、顯示萤皂、保存
本小節(jié)撒穷,我們將學習在Python語言中利用OpenCV庫來實現(xiàn)圖片的讀取、顯示敌蚜、保存,所有的這些圖片都是一個numpy.ndarray窝爪,這三種操作都過cv2.imread()弛车、cv2.imshow()、cv2.imwrite()三個函數(shù)來實現(xiàn)蒲每,同時在文末纷跛,簡要介紹了使用Matplotlib來顯示圖片。本文所使用opencv為opencv3.2版本邀杏,圖片如下:
1. 讀取圖片
在OpenCV中使用cv2.imread()函數(shù)來加載圖片贫奠,該函數(shù)的形式如下:
cv2.imread(path, flags)
參數(shù)意義如下:
- path: 該參數(shù)制定圖片的路徑唬血,可以使用相對路徑,也可以使用絕對路徑唤崭;
- flags:指定以何種方式加載圖片拷恨,有三個取值:
- cv2.IMREAD_COLOR:讀取一副彩色圖片,圖片的透明度會被忽略谢肾,默認為該值腕侄,實際取值為1;
- cv2.IMREAD_GRAYSCALE:以灰度模式讀取一張圖片芦疏,實際取值為0
- cv2.IMREAD_UNCHANGED:加載一副彩色圖像冕杠,透明度不會被忽略。
如果給定的圖片路徑不對酸茴,該函數(shù)不會拋出異常分预,而是返回一個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) #等待按鍵
效果如下:
opencv002.png
|
opencv001.png
|
opencv003.png
|
---|---|---|
cv2.IMREAD_COLOR | cv2.IMREAD_GRAYSCALE | cv2.UNCHANGED |
2. 顯示圖片
使用cv2.imshow()函數(shù)在一個窗口中顯示圖片昆稿,這個窗口自適應圖片的大小,其形式如下:
cv2.imshow(winname, mat)
參數(shù)意義如下:
1. winame:一個字符串纺座,表示創(chuàng)建的窗口名字,每一個窗口必須有一個唯一的名字溉潭;
2. mat:是一個圖片矩陣净响,numpy.ndarray類型
在圖片顯示的過程中,通常會伴隨幾個其他的函數(shù)喳瓣,他們分別是:
- cv2.waitKey()
- cv2.destroyAllWindows()
- cv2.destroyWindow()
- cv2.namedWindow()
因為我們的程序是順序執(zhí)行馋贤,如果沒有cv2.waitKey()
函數(shù),圖像不會顯示(也許是一閃而過畏陕,我們?nèi)搜塾^察不到)配乓,cv2.waitKey()
函數(shù)是一個鍵盤綁定函數(shù)(相當于讓程序在這里掛起暫停執(zhí)行),他接受一個單位為毫秒的時間惠毁,它等待指定時間的鍵盤事件犹芹,在指定時間內(nèi)發(fā)生了鍵盤事件,程序繼續(xù)執(zhí)行鞠绰,否則必須等到時間結(jié)束才能繼續(xù)執(zhí)行腰埂,參數(shù)如果為0表示等待無限長的事件。
cv2.destroyAllWindows()
用來銷毀所有已經(jīng)創(chuàng)建的窗口蜈膨, 如果需要銷毀指定窗口使用cv2.destroyWindow()
函數(shù)屿笼,他接受一個表示窗口名字的名字牺荠。
在這里我們直接用cv2.imshow()
創(chuàng)建的窗口是自動適應圖片大小的,不能縮放驴一,如果我們想放大縮小窗口休雌,必須單獨用cv2.namedWindow()
,并通過flag
參數(shù)指定窗口模式為cv2.WINDOW_NORMAL,默認為cv2.WINDOW_AUTOSIZE.
下面是一個窗口可以發(fā)達縮小的顯示圖片的例子:
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()
函數(shù)來保存圖片,形式如下:
cv2.imwrite(filename, img)
參數(shù)意義如下:
- 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++語言其實采用同樣的函數(shù)魁亦,只是寫法不一樣而已,比如:
import cv2 -> inclue<opencv2/core/core2.hpp>
cv2.imread() -> cv2::imread()
cv2.imshow() -> cv2::imshow()
cv2.imwrite() -> cv2::imwrite()
參考資料