首先我們導入opencv庫,彩色圖像一般都是由RGB(紅綠藍)三顔色通道構成,灰度圖隻有一個顔色通道即暗亮度。在opencv中,圖像的讀取格式是BGR;在matplot中,圖像保存格式是RGB。用opencv的繪圖方法和matplot的繪圖方法展現出來的圖可能會有顔色上的出入,這需要注意一下。
import cv2 # 導入opencv,讀取的格式是BGR
1.1 圖像讀取和顯示
圖像讀取: cv2.imread( 圖片路徑 )
圖像顯示: cv2.imshow( '定義圖像名', 圖像 )
首先,讀取圖片時,文件的路徑名一定要是英文的,不然可能會讀取不了。
#(1)圖像讀取,注意是英文路徑
filepath = 'C:\\...\\opencv\\img'
# 讀取img文件夾中的wise.jpg圖片
img = cv2.imread(filepath '\\wise.jpg')
# 取值範圍0-255
img.shape # (404, 720, 3)
讀取後,變量img中保存的是我們的圖片,每一個像素值都是在0-255之間,shape為3,即長404,寬720,顔色通道3。
接下來我們顯示這張圖象。其中 cv2.waitKey(0) 為顯示圖像後圖像不消失,需要手動關閉,如果設置圖像顯示幾毫秒後自動關閉,填入相應的值。cv2.destroyAllWindows() 代表點擊任意鍵關閉所有窗口。
#(2)顯示圖像
cv2.imshow('wise-man',img) # 傳入(窗口名,圖像)
# 等待時間設為0,讓圖像不會自己消失
cv2.waitKey(0)
# cv2.waitKey(1000) # 圖像顯示1000毫秒後消失
# 鍵盤上任意按一個圖像消失
cv2.destroyAllWindows()
輸出圖像如下。
1.2 轉換灰度圖
方法: cv2.imread(路徑, cv2.IMREAD_GRAYSCALE)
轉換灰度圖隻需要在讀取圖像函數中增加一個參數 cv2.IMREAD_GRAYSCALE,就能在讀取圖像時将圖像從彩圖轉變成灰度圖。
# 讀取圖像轉換灰度圖
img = cv2.imread(filepath '\\wise.jpg',cv2.IMREAD_GRAYSCALE)
img.shape # 查看圖像的shape,灰度圖隻有一個顔色通道
# 顯示圖像
cv2.imshow('wise-man',img)
# 手動關閉窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
輸出結果如下,可以和上圖的原圖比較
1.3 圖像保存
cv2.imwrite(路徑, 圖像變量)
将圖像保存到指定文件夾filpath,再給這個圖片命名。執行代碼會有返回值,如果是True證明保存成功。
cv2.imwrite(filepath '\\gray.jpg',img) # 指定路徑,圖像
1.4 其他基礎操作
# 查看形狀
img.shape
# 查看數據類型
type(img) # 數組類型
# 計算像素點個數
img.size # 872640個
# 數據類型
img.dtype #'uint8'
2.1 視頻讀取
讀取方法: cv2.VideoCapture(文件路徑)
#(1)視頻讀取
# 視頻所在文件夾
filepath = 'C:\\...\\video'
# 讀取文件夾中的哪一個視頻
video = cv2.VideoCapture(filepath '\\walking.mp4')
查看視頻能否被打開。變量.read() 從視頻中提取一幀圖片,需要循環來不斷提取。用right接收是否能打開,返回True表示可以打開。frame保存返回的的每一幀圖像。
#(2)檢查是否打開正确
if video.isOpened(): # 如果能打開
# 返回布爾類型,和每一幀數據
right,frame = video.read() # 每次執行讀取一幀結果
else: # 如果不能打開
open = False
2.2 讀取整個視頻
#(3)讀取整個視頻
while open:
# 每一次循環讀取一幀,返回是否打開right和每幀圖像結果frame
right,frame = video.read() # video存放讀入的視頻
# 如果讀取的一幀是空值,說明讀取結束,循環停止
if frame is None:
break
if right == True: # 對每一幀圖像處理
# 圖像色彩轉換函數,将當前圖像變成灰度
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 處理後将每幀圖像依次呈現出來
cv2.imshow('changed',gray)
# 設置每幀圖像停留時間10ms,正常速度33ms,并指定退出鍵ESC退出視頻
if cv2.waitKey(10)&0xFF==27:
break
# 運行結束後,釋放視頻資源
video.release()
# 任意鍵退出
cv2.destroyAllWindows()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 表示将幀圖片frame變成灰度圖。cv2.waitKey(10) 設置每張圖片的顯示時間10ms,0xFF==27代表使用ESC鍵退出視頻。
3. 圖像截取為了下面顯示圖像方便,我們先定義一個圖像顯示函數。
import cv2
# 定義一個圖像展示函數
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
接下來提取圖像,由于提取的圖像數據是數組類型,因此可以使用切片的方法來裁剪圖像。
# roi區域,截取圖像中的一部分
# 獲取指定路徑圖像
filepath = 'C:\\Users\\admin\\.spyder-py3\\test\\opencv\\img'
img = cv2.imread(filepath '\\wise2.jpg')
# 展示讀入的圖像
cv_show('wise-man',img)
# 由于讀入的圖像是數組類型,可以進行切片
wise2 = img[200:700,200:700]
# 展示切片後的圖像
cv_show('changed',wise2)
4.1 提取三通道
通道拆分: cv2.split(圖像變量)
拆分後得到每一個通道的圖像,分别為B、G、R
# ==1== cv2.split()切分
B,G,R = cv2.split(img) # 對原圖像切分,把channel層分開
由于圖像是數組類型,使用索引方法切分通道
# ==2== 使用索引方法,提取三通道
B = img[:,:,0] # 通道的第0個是B
G = img[:,:,1]
R = img[:,:,2]
4.2 顔色通道組合
通道組合: cv2.merge(通道層)
#(3)顔色通道組合
img2 = cv2.merge((B,G,R))
# 使用定義的函數繪圖
cv_show('merged',img2)
4.3 隻保留某個通道
使用索引方法使其他幾個通道為0即可
#(4)隻保留某個通道
# 首先複制一張圖像
img3 = img.copy() # 複制img
# 隻保留G通道
img3[:,:,0] = 0 # B通道為0
img3[:,:,2] = 0 # R通道為0
# 使用定義的函數
cv_show('G-channel',img3)
# 效果圖上面的右邊
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!