opencv-python圖像讀寫模塊示例詳解
這個分類記錄自己學(xué)習(xí)opencv的隨筆文檔,方便以后查詢和復(fù)習(xí)。python-opencv環(huán)境配置網(wǎng)上教程很多,此處就不做贅述了,該文檔記錄opencv最基礎(chǔ)的圖像讀寫和顯示,以及圖像編碼解碼,工具是jupyter notebook。
1 opencv中,圖像讀取函數(shù)是 imread(filename, flags=None)
參數(shù)說明:
filename:讀取圖像的路徑,通常支持jpg、png、bmp、tiff等格式文件。
flags:圖片讀入的模式,模式定義在cv::ImreadModels中,默認(rèn)值為IMREAD_COLOR。還有一個常用的模式是:IMREAD_GRAYSCALE,對應(yīng)值為 0,以灰度圖方式讀取圖片。
注意:imread函數(shù)返回一個BGR形式的圖像對象,其類型為一個numpy數(shù)組。
2 顯示圖像的函數(shù)是 imshow(window_name, image)
參數(shù)說明:window_name是一個字符串,代表要在其中顯示圖像的窗口的名稱。image是它是要顯示的圖像。
可以用 namedWindow(window_name, flag)來定義一個窗口,如果沒有定義會根據(jù) imshow 的參數(shù)自動生成一個窗口。已經(jīng)定義的窗口可以用 resizeWindow(window_name,width,height) 來改變窗口大小。
import cv2 import numpy as np img=cv2.imread('C:/Users/86188/Desktop/test/python/cat.jpg',cv2.IMREAD_COLOR) #讀取圖片<br> cv2.imshow('showimg',img) #顯示圖片 cv2.waitKey(0) #等待用戶操作 cv2.destroyWindow('window') #銷毀窗口
3 除了直接用opencv的imshow來顯示圖片,也可以用matplotlib來顯示圖片
注意需要在顯示的時候進(jìn)行圖片通道翻轉(zhuǎn)(直接用::-1,也可以用cvtColor()函數(shù)進(jìn)行顏色通道翻轉(zhuǎn)),否則顯示的圖片顏色會異常,因?yàn)檎D片的格式是RGB,但是opencv讀取進(jìn)來的格式是BGR。
用opencv來顯示圖像通常需要好幾行代碼,可以自己封裝成函數(shù),需要的時候直接調(diào)用:
4 opencv中圖像的屬性
在OpenCV中,圖像是一個NumPy數(shù)組,我們可以使用numpy數(shù)組的屬性來訪問圖像屬性:
- 圖像類型- 圖像的數(shù)據(jù)結(jié)構(gòu)。OpenCV中的圖像是numpy.ndarray,我們可以將其訪問為type(img)。
- 圖像形狀- 它是以[H, W, C]格式表示的形狀。其中H,W和C分別是圖像的高度,寬度和通道數(shù) ,我們可以將其訪問為img.shape。
- 圖像大小- 它是圖像中像素的總數(shù)。它也是數(shù)組中元素的總數(shù)。我們可以將其訪問為img.size。
- 數(shù)據(jù)類型- 它是圖像數(shù)組元素的dtype。我們可以將其訪問為img.dtype。
5 圖片保存 imwrite(filename,img)
參數(shù)說明: filename 表示保存的文件名稱,img 是需要保存的圖像對象。
創(chuàng)建窗口,讀取顯示和保存圖像的實(shí)例如下:
import cv2 #創(chuàng)建窗口 cv2.namedWindow('img',cv2.WINDOW_NORMAL) cv2.resizeWindow('img',640,480) #讀取圖片 img = cv2.imread('./cat.jpg') while True: cv2.imshow('img',img) key = cv2.waitKey(0) #該函數(shù)的返回值為ASCII碼,參數(shù)0表示:等待 0 毫秒后,用戶可以通過按鍵盤上的任意鍵來銷毀所有窗口。 if key == ord('q'): #如果鍵盤輸入q,退出 break elif key == ord('s'): #如果鍵盤輸入s,保存圖片到 當(dāng)前文件夾下, ord()是把輸入的字符轉(zhuǎn)換為對應(yīng)的ASCII碼。 cv2.imwrite('./mycat.png',img) else: print(key) cv2.destroyAllWindows() #銷毀當(dāng)前所有窗口
此外,opencv中也可以進(jìn)行多幅圖像的讀取,函數(shù)是 imreadmulti(filename) 參數(shù)filename是待讀取的圖像文件路徑,返回的結(jié)果是tuple類型,包含兩個值,第一個為bool類型,表示是否讀取成功;第二個參數(shù)是list類型,保存讀取的圖像結(jié)果。多幅圖像保存可以用imwritemulti(filename,img) .參數(shù)filename表示保存的圖像文件名稱,img是圖像數(shù)據(jù)。
6 圖像編碼 imencode(ext,img)
參數(shù)說明:ext: 文件擴(kuò)展名,用來決定輸出格式。img: 待編碼圖像數(shù)據(jù)。
圖像編碼后保存在文件中,這里涉及到文件的讀寫操作,Python內(nèi)置了讀寫文件的函數(shù) with open語句。常用的讀寫操作如下:
with open('filename.txt', 'r') as f: content = f.read(f) #文件的讀操作<br> with open('data.txt', 'w') as f: f.write('hello world') #文件的寫操作
下面將讀取的圖像進(jìn)行編碼,然后保存到txt文件中(編碼后要把數(shù)據(jù)轉(zhuǎn)換為二進(jìn)制)。
import cv2 #圖像編碼為數(shù)據(jù)流,方便網(wǎng)絡(luò)傳輸 import numpy as np img = cv2.imread('cat.jpg') ret,img_encode = cv2.imencode(' .jpg',img) #圖像編碼,返回值ret為bool類型,img_encode為返回的數(shù)據(jù)流,ndarray格式 print(type(img_encode)) bytes_encode = img_encode.tobytes() #把編碼的數(shù)據(jù)類型轉(zhuǎn)換為bytes二進(jìn)制 print(type(bytes_encode)) with open("imencode.txt","wb") as f: #以二進(jìn)制格式打開一個文件只用于寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng)建新文件。 f.write(bytes_encode) # 把數(shù)據(jù)存儲到文本中
執(zhí)行完成后,會在當(dāng)前路徑下生成imencode.txt文件,其中保存著編碼后的圖像數(shù)據(jù)。但是文本打開沒法正常顯示二進(jìn)制,會亂碼。
7 圖像解碼 imdecode(buf, flags)
參數(shù)說明:buf: bytes類型的輸入數(shù)據(jù)流,flags: 解碼標(biāo)志,由ImreadModes定義,常用的有IMREAD_GRAYSCALE, IMREAD_COLOR 。
下面從剛才保存的txt文件中讀取圖像數(shù)據(jù)流,然后將數(shù)據(jù)流解碼為圖像顯示(要把讀取的數(shù)據(jù)流轉(zhuǎn)換為ndarray格式再進(jìn)行解碼)。
import cv2 #圖像解碼 import numpy as np with open('imencode.txt','rb') as f: #以二進(jìn)制格式打開一個文件用于只讀。文件指針將會放在文件的開頭。這是默認(rèn)模式。 data_encode = f.read() #從文件中讀取圖像數(shù)據(jù) img_array = np.frombuffer(data_encode,dtype=np.uint8) # 把讀取的數(shù)據(jù)流轉(zhuǎn)換為ndarray(數(shù)組)格式 img_decode = cv2.imdecode(img_array,cv2.IMREAD_COLOR) #圖像解碼 cv2.imshow('img_decode',img_decode) cv2.waitKey(0) cv2.destroyAllWindows()
到此這篇關(guān)于opencv-python圖像讀寫模塊的文章就介紹到這了,更多相關(guān)opencv-python圖像讀寫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)百度關(guān)鍵詞排名查詢
這篇文章主要介紹了python實(shí)現(xiàn)百度關(guān)鍵詞排名查詢,需要的朋友可以參考下2014-03-03對pytorch中x = x.view(x.size(0), -1) 的理解說明
這篇文章主要介紹了對pytorch中x = x.view(x.size(0), -1) 的理解說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03pandas中DataFrame的merge操作的實(shí)現(xiàn)
本文主要介紹了pandas中DataFrame的merge操作的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07Python如何實(shí)現(xiàn)PDF隱私信息檢測
隨著越來越多的個人信息以電子形式存儲和傳輸,確保這些信息的安全至關(guān)重要,本文將介紹如何使用Python檢測PDF文件中的隱私信息,需要的可以參考下2025-02-02python3 實(shí)現(xiàn)爬取TOP500的音樂信息并存儲到mongoDB數(shù)據(jù)庫中
今天小編就為大家分享一篇python3 實(shí)現(xiàn)爬取TOP500的音樂信息并存儲到mongoDB數(shù)據(jù)庫中,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08通過Python模塊filecmp 對文件比較的實(shí)現(xiàn)方法
這篇文章主要介紹了通過Python模塊filecmp 對文件比較的實(shí)現(xiàn)方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-06-06利用Python實(shí)現(xiàn)K-Means聚類的方法實(shí)例(案例:用戶分類)
k-means是發(fā)現(xiàn)給定數(shù)據(jù)集的k個簇的算法,也就是將數(shù)據(jù)集聚合為k類的算法,下面這篇文章主要給大家介紹了關(guān)于利用Python實(shí)現(xiàn)K-Means聚類的相關(guān)資料,需要的朋友可以參考下2022-05-05python基于pdfminer庫提取pdf文字代碼實(shí)例
這篇文章主要介紹了python 提取pdf文字代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08PyTorch 遷移學(xué)習(xí)實(shí)戰(zhàn)
本文主要介紹了PyTorch 遷移學(xué)習(xí)實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01