這篇教學會介紹OpenCV 里imread()、imshow()、waitKey() 方法,透過這些方法,在電腦中使用不同的色彩模式開啟圖片并顯示圖片。
imread() 開啟圖片
使用imread() 方法,可以開啟圖片,imread() 有兩個參數,第一個參數為檔案的路徑和名稱,第二個參數可不填,表示以何種模式( mode ) 開啟圖片,開啟的圖片支援常見的jpg、png...等格式,下面是最基本開啟圖片的程式碼。
import cv2
img = cv2.imread('meme.jpg') # 開啟圖片,預設使用 cv2.IMREAD_COLOR 模式
cv2.imshow('oxxostudio', img) # 使用名為 oxxostudio 的視窗開啟圖片
cv2.waitKey(0) # 按下任意鍵停止
cv2.destroyAllWindows() # 結束所有圖片視窗
如果設定第二個參數,就能使用不同的色彩模式開啟圖片,下面的程式碼執行后,會以灰階模式開啟圖片。
import cv2
img = cv2.imread('meme.jpg', cv2.IMREAD_GRAYSCALE) # 使用 cv2.IMREAD_GRAYSCALE 模式
# img = cv2.imread('meme.jpg', 2) # 也可使用數字代表模式
cv2.imshow('oxxostudio', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
imshow() 顯示圖片
在上面的程式碼中,使用了imshow() 的方法顯示圖片,imshow() 包含兩個參數,第一個參數為字串,表示要開啟圖片的視窗名稱,第二個參數為使用imread()讀取的圖片。
waitKey() 等待多久關閉
使用imshow() 方法時會搭配waitKey(),waitKey() 表示等待與讀取使用者按下的按鍵,包含一個單位為「毫秒」的參數,如果設定0 表示持續等待至使用者按下按鍵為止,下方的程式碼設定waitKey 的參數為2000,表示兩秒后會關閉圖片視窗( 兩秒內如果按下q 就會中止計時并關閉視窗)。
如果遇到視窗無法關閉的狀況,可以使用destroyAllWindows() 的方法關閉所有視窗,或使用destroyWindow(name) 關閉指定名稱的視窗。
import cv2
img = cv2.imread('meme.jpg', cv2.IMREAD_GRAYSCALE) # 使用 cv2.IMREAD_GRAYSCALE 模式
cv2.imshow('oxxostudio', img)
cv2.waitKey(2000) # 等待兩秒 ( 2000 毫秒 ) 后關閉圖片視窗
cv2.destroyAllWindows()
色彩模式數字對照表
寫入并儲存圖片
這篇教學會介紹OpenCV 里的imwrite() 方法,實現將圖片另存新檔( 也可轉檔) 的功能。
imwrite() 寫入并儲存圖片
使用imwrite() 方法,可以將處理好的資料內容寫入并儲存為圖片,imwrite() 有三個參數,第一個參數為檔案的路徑和名稱,第二個參數為要寫入的資料內容,第三個參數為圖片壓縮品質的設定
下方的程式碼執行后,會先用「灰階模式」開啟一張圖片,然后再將其存檔為壓縮品質80 的jpg 和套用預設值的png 圖檔。
import cv2
img = cv2.imread('meme.jpg', cv2.IMREAD_GRAYSCALE) # 以灰階模式開啟圖片
cv2.imwrite('oxxostudio_2.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 80]) # 存成 jpg
cv2.imwrite('oxxostudio_3.png', img) # 存成 png
儲存陣列產生的圖片
在Python 里,圖片可以使用「三維陣列」的方式表現(長寬各多少個像素、每個像素里包含的顏色資訊是什么),因此如果提供特定格式的三維陣列的資料,就能讓OpenCV 畫出圖形。
下面的范例使用numpy 函式庫,快速產生500x500,每個項目為[0,0,0] 的三維陣列,接著再讓陣列中間的正方形區域的項目設定為[0,0,255],呈現的就是一張500x500 大小,黑色背景,中間200x200 紅色正方形的圖形,最后使用imwrite() 的方法,就能儲存這張圖片。
注意!OpenCV 里的顏色為「BGR」,并非RGB,顏色色碼為0~255。
import cv2
import numpy as np
img = np.zeros((500,500,3), dtype='uint8') # 快速產生 500x500,每個項目為 [0,0,0] 的三維陣列
img[150:350, 150:350] = [0,0,255] # 將中間 200x200 的每個項目內容,改為 [0,0,255]
cv2.imwrite('oxxostudio.jpg', img) # 存成 jpg
cv2.imshow('oxxostudio', img) # 顯示圖片
cv2.waitKey(0) # 按下任意鍵停止
cv2.destroyAllWindows()