本系列專欄寫作方式交代
本系列專欄寫作將采用首創的問答式寫作形式,快速讓你學習到 OpenCV 的初級、中級、高級知識,
1. OpenCV 中圖片是如何加載與顯示的?
學習 OpenCV 的第一步就是加載圖片,類似學習任何編程語言的 Hello Word一樣, 將電腦磁盤上的圖片加載到程式中,才可以進行后續的操作,
在加載圖片的程序中,我們將使用到三個核心函式,分別如下:
- cv2.imread 讀取圖片
- cv2.imshow 展示圖片
- cv2.imwrite 寫入圖片
任何影像處理領域的高手,都是伴隨這三個函式起步的,接下來你也將接觸到這3個起始函式啦
cv2.imread 讀取圖片的用法與注意事項
在讀取圖片之前,你首先要知道圖片所在的位置,即電腦磁盤路徑,該部分如果你完全零基礎,建議你學習【絕對路徑】與【相對路徑】相關知識,
cv2.imread 函式具備兩個必會引數,其一圖片路徑,其二是讀取方式,也就是告訴程式如何讀取這幅影像,
第一個引數的取值非常簡單,就是電腦上任意圖片路徑即可,重點注意圖片的后綴名(擴展名),
第二個引數取值非常多,初學階段掌握以下兩個數值即可
- cv2.IMREAD_COLOR,讀取彩色影像,此時忽略影像的透明度,使用該值時,如果讀取的是透明
png圖片,一定要注意,透明通道不會被讀取到 - cv2.IMREAD_GRAYSCALE 灰度圖方式讀取
- CV2.IMREAD_UNCHANGED 讀入的影像包括 alpha 通道,即透明通道
這里存在一個問題,需要特別說明一下:
除了上述幾個值以外,還有其他值,但是在學習階段可以先略過,等到需要的時候,
那這里就有一個常見疑問,就是存在這樣一個值 cv2.IMREAD_ANYCOLOR,這個值與 cv2.IMREAD_COLOR
有何區別呢?
cv2.IMREAD_COLOR : 設定該值只會讀取BGR三個通道;
cv2.IMREAD_ANYCOLOR :設定該值會按照任何可能的顏色通道讀取;
如果你一直操作的都是 BGR 通道的圖片,那 ANYCOLOR 永遠意識不到區別
讀取圖片的代碼如下
import cv2
img = cv2.imread('./test_img.jpg')
print(type(img))
以上代碼從Python語言上來看,沒有什么特別難的地方,但是會出現如下錯誤
本系列專欄既然是為了解決問題而寫,那我們關注的就是BUG,
讀取圖片的時候,正常會讀取到一個圖片資源,圖片型別如下所示
<class 'numpy.ndarray'>
但是,很多時候,會回傳一個空值
<class 'NoneType'>
該值出現的原因是,你的圖片路徑不對,即沒有讀取到你的目標圖片,修改圖片路徑即可解決問題,
本部分代碼中 './test_img.jpg' 為圖片路徑,專業術語叫做硬編碼,實際開發程序中,建議采用os、path 模塊實作對路徑的自動處理,
還有一種可能性會導致你回傳 <class 'NoneType'> ,不過該種可能性出現的情況比較少,很多人會忽略,就是圖片所在的檔案夾,你沒有權限進行訪問,如果該問題出現了,你需要補充的就是檔案權限相關的知識,
cv2.imshow 顯示影像的使用方法與相關注意事項
默認使用 cv2.imshow 函式即可顯示影像,而且打開的視窗會自適應圖片,該函式也包含兩個引數,其一是視窗名字,注意不要使用中文,其二是影像,
這個函式的實際應用比較簡單,但是有如下問題,需要注意,具體代碼為:
import cv2
img = cv2.imread('./test_img.jpg')
print(type(img))
cv2.imshow('image',img)
cv2.imshow('image',img)
cv2.waitKey(0)

測驗上述代碼之后,程式運行之后只會出現一個視窗,這是因為我們兩次使用 cv2.imshow 函式,第一個視窗名稱引數給了相同的值,如果希望打開兩個視窗,一定要將該引數設定為不同值,
這里還擴展出了一個新的函式 cv2.waitKey,如果沒有該函式,視窗將一閃而過,
該函式準確的說是鍵盤系結的函式,只是這里用了它等待回應這一目的,
cv2.waitKey具備一個引數,含義是時間,注意單位是毫秒,如果期望設定具體的毫秒數,按照預期設定引數值即可,如果設定為 0,視窗將無限等待下去,直到關閉,或者按下特定按鍵,
在這個地方有一個需要特別注明,并且大家可以擴展學習的知識點
一般情況下,我們按照如下設定進行視窗檢測:
k = cv2.waitKey(0)
if k == 27:
pass
以上代碼在 32 位機器上可以正常運行,但是在 64 位機器,建議按照下述代碼修改:
k = cv2.waitKey(0) & 0xFF
if k == 27:
pass
上述代碼還可以進行修改,具體如下:
import cv2
img = cv2.imread('./test_img.jpg')
cv2.startWindowThread()
cv2.namedWindow("image_show")
cv2.imshow("image_show", img)
cv2.waitKey()
其中新增加了 cv2.startWindowThread函式與cv2.namedWindow函式
以上兩個函式的含義如下:
- cv2.startWindowThread:新開一個執行緒用于實時重繪圖片
- cv2.namedWindow:命名一個視窗,并且讓視窗可調整
cv2.namedWindow函式可以進行拆解下:
默認情況下,我們使用 cv2.imshow 打開的視窗是不能調整視窗比例的,如果希望可以調整,就必須用到 cv2.namedWidows 函式,畢竟不是所有的電腦都是高解析度的,例如橡皮擦自己的電腦就很難展示大圖,
該函式的原型如下:
cv.namedWindow(winname, flags=None)
其中 winname 是視窗名稱,后續 cv2.imshow 在呼叫的時候,第一個引數要與其匹配上,第二個引數是視窗標志,
- WINDOW_NORMAL:顯示影像后,允許用戶隨意調整視窗大小;
- WINDOW_AUTOSIZE:根據影像大小顯示視窗,不允許用戶調整大小;
- WINDOW_FREERATIO:視窗大小自適應比例;
- WINDOW_KEEPRATIO:保持影像的比例,
默認值是 WINDOW_AUTOSIZE,
以上內容比較簡單,不做代碼演示,
cv2.imwrite 寫入影像的使用方法與相關注意事項
使用 cv2.imwrite 函式可以保存一張圖片,該函式也具備兩個引數,第一個為圖片名,第二個為待保存的圖片
該函式的使用非常簡單:
import cv2
img = cv2.imread('test_img.jpg')
cv2.imwrite('test.jpg',img)
該函式還有一個非必填引數,即可選引數,并且它存在不同解釋,
如果保存的為 JPG 圖片,表示的是影像的質量,用 0~100 的整數表示;
如果保存的為 PNG 圖片,表示的是壓縮級別,默認為 3
使用的時候,參照如下代碼即可:
cv2.imwrite('test.jpg',img, [int(cv2.IMWRITE_JPEG_QUALITY), 95])
cv2.imwrite('test.png',img, [int(cv2.IMWRITE_PNG_COMPRESSION), 4])
如果使用 cv2.imwrite發現檔案并沒有存盤成功,注意,該問題可能是中文路徑的問題,例如下述代碼:
import cv2
img = cv2.imread('test_img.jpg')
cv2.imwrite('./圖片/test.jpg',img)
出現該問題之后,建議將中文路徑名進行修改,否則只能切換其他影像保存方法,
/kbd>發現檔案并沒有存盤成功,注意,該問題可能是中文路徑的問題,例如下述代碼:
import cv2
img = cv2.imread('test_img.jpg')
cv2.imwrite('./圖片/test.jpg',img)
出現該問題之后,建議將中文路徑名進行修改,否則只能切換其他影像保存方法,
本文章橡皮擦原為 ebaina 社區寫作,現補發到CSDN頻道,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/291738.html
標籤:其他
