跟著大白小浪一起學——人工智能-計算機視覺(一)
- 學習網站
- 前言
- 4、影像的基本操作
- 資料讀取-影像
- 資料讀取-視頻
- 截取部分影像資料
- 顏色通道提取
- 邊界填充
- 數值計算與影像融合
學習網站
B站學習網址:人工智能-計算機視覺
唐宇迪:影像處理與計算機視徑訓礎分享,其中包含超多實戰專案:信用卡數字識別專案、檔案掃描OCR識別專案、全景影像拼接專案、停車場車位識別專案、答題卡識別判卷專案、新聞資料集文本分類專案、基于CNN搭建影像識別模型專案等實戰專案
前言
前面一至三章為基礎環境配置部分,這里不做過多講解和記錄,有需要的同學可以自行CSDN,
4、影像的基本操作
計算機影像是由很多個像素點組成的,這些像素點通常以矩陣形式排列,這個矩陣就表示著你這個影像的一個大小

資料讀取-影像
- cv2.IMREAD_COLOR:彩色影像
- cv2.IMREAD_GRAYSCALE:灰度影像
import cv2 #opencv讀取的格式是BGR
import numpy as np
img = cv2.imread('cat.jpg') #讀取影像的函式
詳細請參考:cv2 imread()函式
#影像的顯示,也可以創建多個視窗
cv2.imshow('image',img)
#等待時間,毫秒級,引數為0表示按任意鍵終止,引數為1000的話表示1000ms就終止
cv2.waitKey(0)
cv2.destroyAllWindows()
為了方便,我們可以撰寫一個函式來展示影像
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
接下來讓我們看一下影像的一些屬性(這里的img都是拿上述img舉例)
img.shape
#執行結果為:(414,500,3),其中,從左到右依次表示:w(寬度),h(高度),c(3為3通道的意思,這里指的的BGR三通道)
現在我們更改一下影像的顏色屬性為灰度圖試試
img = cv2.imread('cat.jpg',cv2.IMREAD_GRAYSCALE)
img.shape
#執行結果為 (414,500)
關于影像的保存這里也簡單提及一下:
#保存
cv2.imwrite('你要保存的路徑和名字',img)
其他的影像的屬性還有:
- img.dtype
- img.size
- type(img)
資料讀取-視頻
- cv2.VideoCapture可以捕獲攝像頭,用數字來控制不同的設備,例如0,1,
- 如果是視頻檔案,直接指定好路徑即可,
- 其實視頻也就是由一幀幀靜止的圖片播放來的,
vc = cv2.VideoCapture('test.mp4')
#檢查是否打開正確
if vc.isOpened():
#vc.read會從視頻中一幀一幀去讀取圖片,然后會回傳兩個值:open,frame,
#open是個布爾型別回傳值,frame是指當前這一幀的影像
open,frame = vc.read()
else:
open = False
#如果視頻打開正常我就開始對一幀一幀的影像進行處理
while open:
ret,frame = vc.read()
if frame is None:
break
if ret == True:
# cv2.cvtColor(img, p2)是顏色空間轉換函式,img是需要轉換的圖片,p2是轉換成何種格式,
# cv2.COLOR_BGR2RGB 將BGR格式轉換成RGB格式
# cv2.COLOR_BGR2GRAY 將BGR格式轉換成灰度圖片
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
cv2.imshow("顏色轉換后灰度視頻流",gray)
if cv2.waitKey(10) & 0xFF == 27:
break
vc.release()
cv2.destroyAllWindows()
截取部分影像資料
"""
截取部分影像資料
其中的img[200:300,100:400]指的是截取的區域
"""
img = cv2.imread('1.jpg')
cut_up = img[200:300,100:400]
詳細可參考:影像處理基礎
顏色通道提取
剛才我們也說了,opencv中顏色通道為BGR,我們可以用cv2.split把BGR三個通道給分別切分開來,當然,我們也可以將它們再通過cv2.merge合并起來
b,g,r = cv2.split(img)
img = cv2.merge((b,g,r))
那如何看各個通道長什么樣子呢?
#我們只保留R通道試試,將其他兩個通道的值都置為0
cur_img = img.copy()
cur_img[:,:,0] = 0 #還記的我們的img的shape嗎?(w,h,c),c為三色通道BGR,此處的意思即為讓B通道亮度值都為0
cur_img[:,:,1] = 0 #此處的意思即為讓G通道亮度值都為0
cv_show('R',cur_img)
邊界填充
什么是邊界填充?簡單來說就是給影像的邊緣填充一些東西,例如給影像的上下左右添加一些邊框,
函式介紹
cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
- BORDER_REPLICATE:復制法,也就是復制最邊緣像素,
- BORDER_REFLECT:反射法,對感興趣的影像中的像素在兩邊進行復制例如:fedcba|abcdefgh|hgfedcb
- BORDER_REFLECT_101:反射法,也就是以最邊緣像素為軸,對稱,gfedcb|abcdefgh|gfedcba
- BORDER_WRAP:外包裝法cdefgh|abcdefgh|abcdefg
- BORDER_CONSTANT:常量法,常數值填充,需要在函式中填入常數引數,
由于篇幅原因這里不過多贅述,之后再做詳細說明,效果可見:
OpenCV–影像邊界填充
數值計算與影像融合
由于篇幅原因這里只提供一些常見的函式,詳細請自行查找
- cv2.addWeighted 函式是將兩張相同大小,相同型別的圖片融合的函式
- cv2.resize 調整圖片尺寸,大小等等
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/356200.html
標籤:其他
上一篇:[ C語言 ] 用C語言實作小游戲 ---- 三子棋 代碼 + 決議
下一篇:人臉相關應用的優化手段
