tft每日頭條

 > 科技

 > opencv怎麼識别圖像區域

opencv怎麼識别圖像區域

科技 更新时间:2025-02-11 08:47:41
1. 圖像操作

首先我們導入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()

輸出圖像如下。

opencv怎麼識别圖像區域(OpenCV基礎操作圖像讀取)1

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()

輸出結果如下,可以和上圖的原圖比較

opencv怎麼識别圖像區域(OpenCV基礎操作圖像讀取)2

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. 視頻操作

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)

opencv怎麼識别圖像區域(OpenCV基礎操作圖像讀取)3

4. 顔色通道

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)

opencv怎麼識别圖像區域(OpenCV基礎操作圖像讀取)4

opencv怎麼識别圖像區域(OpenCV基礎操作圖像讀取)5

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每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved