3.OpenCV的影像基礎操作
文章目錄
- 前言
- 一、讀、寫、顯示影像
- 二、讀、寫、播放視頻
- 三、操作灰度影像
- 四、操作彩色影像
- 五、影像通道操作
- 總結
前言
??OpenCV的imread()、imwrite()、imshow()函式分別用于讀寫和顯示影像,VideoCapture類和VideoWriter類提供了視頻處理能力,支持各種格式的視頻檔案,
??計算機在處理影像資訊時,將灰度處理為256級(0~255),0表示黑色,255表示白色,用一個位元組來存盤一個像素值,OpenCV使用單通道的二維陣列來表示灰度影像,對于彩色通道,顏色的表示方法有所不同,可以根據公式相互轉化,例如R、G、B通道,用3個通道的像素組合表示彩色影像,在OpenCV中可以對影像的彩色通道進行拆分和合并(需要注意的是OpenCV默認的影像格式為BGR),
一、讀、寫、顯示影像
??使用OpenCV-Python處理影像時,實作不同的功能,程式有基本的模板,匯入必要的包后,按照固定的模板稍作修改就可以實作想要的功能,
首先,匯入必要的包,
import cv2
import numpy as np
import matplotlib.pyplot as plt
(1) 使用imread()讀取影像時,可根據需要修改影像讀取格式標志,
image1 = cv2.imread('parrot.png',cv2.IMREAD_COLOR) # 加載彩色影像,任何影像的透明度都會被忽視,它是默認標志
image2 = cv2.imread('parrot.png',cv2.IMREAD_GRAYSCALE) # 以灰度模式加載影像
image3 = cv2.imread('parrot.png',cv2.IMREAD_UNCHANGED) # 加載影像,包括alpha通道
# 注意,除了這三個標志,也可以分別傳遞整數1、0或-1,
(2) 使用imread()讀取RGB影像,利用 matplotlib.pyplot顯示影像,
image = cv2.imread('lena.jpg', cv2.IMREAD_COLOR)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 轉換顏色通道
plt.imshow(image)
plt.axis('off')
plt.show()
(3) 使用imread()讀取灰度影像,利用imshow()顯示影像,
img = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('IMREAD_GRAYSCALE', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
(4) 使用imread()讀取灰度影像,利用imshow()顯示影像,并進行imwrite()保存影像,
image = cv2.imread('lena.jpg', cv2.IMREAD_REDUCED_GRAYSCALE_8)
cv2.namedWindow('IMAGE', cv2.WINDOW_NORMAL)
cv2.imshow('IMAGE', image)
k = cv2.waitKey(0)
if k == 27:
cv2.destroyAllWindows()
elif k == ord('s'):
cv2.imwrite('IMREAD_REDUCED_GRAYSCALE_8.jpg',image)
cv2.destroyAllWindows()
二、讀、寫、播放視頻
??視頻處理的基本操作步驟如下:
(1) 將視頻檔案或攝像頭作為資料來源來創建VideoCapture物件,
(2) 呼叫VideoCapture物件的read()方法獲取視頻中的幀,每一幀都是一幅影像,
(3)呼叫VideoWriter物件的writer()方法將幀寫入視頻檔案,或者呼叫cv2.imshow()函式在視窗中顯示幀(即播放視頻),
# 從視頻檔案(攝像頭)獲取影像資料
capture = cv2.VideoCapture('vtest.avi') # 視頻檔案,路徑為0時讀取攝像頭
# 獲取——幀(一張照片)的寬度、高度、FPS
frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = capture.get(cv2.CAP_PROP_FPS)
print("frame width(寬): {}".format(frame_width))
print("frame height(高): {}".format(frame_height))
print("frames per second(幀FPS): {}".format(fps))
if capture.isOpened() is False: # 判斷攝像頭是否打開 capture.isOpened() --> 回傳True or False
print('CAMERA ERROR !')
while capture.isOpened():
ret, frame = capture.read() # 通過攝像頭,一幀一幀的捕獲,回傳一個布林值(True/False),捕獲每一幀(每一張照片)
if ret is True: # ret讀取成功為True、讀取失敗為False --> 本地視頻檔案讀取完成后關閉(brake)視頻
cv2.imshow('FRAME', frame) # 顯示捕獲的幀
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 將捕獲的幀轉化為灰度的幀
cv2.imshow('GRAY FRAME', gray_frame) # 顯示灰度的幀
k = cv2.waitKey(100)
if k == ord('q'):
break
else:
break
capture.release()
cv2.destroyAllWindows()
# 讀取彩色視頻檔案,保存為灰度視頻檔案
capture = cv2.VideoCapture('vtest.avi')
frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = capture.get(cv2.CAP_PROP_FPS)
if capture.isOpened() is False:
print("Camera Error")
fourcc = cv2.VideoWriter_fourcc(*"XVID")
output_gray = cv2.VideoWriter('vtest_out.mp4', fourcc, int(fps), (int(frame_width),int(frame_height)), False)
while capture.isOpened():
ret, frame = capture.read()
if ret is True:
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
output_gray.write(gray_frame)
cv2.imshow('Gray',gray_frame)
k = cv2.waitKey(25)
if k == ord('s'):
break
else:
break
capture.release()
output_gray.release()
cv2.destroyAllWindows()
三、操作灰度影像
img = np.zeros((1024,1024),dtype='uint8')
n=0
while True:
cv2.imshow('gray',img)
n += 20
img[: ,:] = n # 將影像全部像素修改為 n ,n 的值在程式運行程序中不斷增大
print(img[1,1])
k=cv2.waitKey(500)
if k == 27:
cv2.destroyAllWindows()
break
四、操作彩色影像
img = np.zeros((240,240,3), dtype='uint8')
r0 = 0
r1 = 1
r2 = 2
while True:
img[:80,:,r0] = 255
img[80:160,:,r1] = 255
img[160:,:,r2] = 255
cv2.imshow('color', img)
key = cv2.waitKey(1000)
img[:,:,:] = 0
t=r0
r0=r1
r1=r2
r2=t
if key == 27:
cv2.destroyAllWindows()
break
五、影像通道操作
(1) 通過陣列索引拆分通道
img = cv2.imread('lena.jpg', cv2.IMREAD_REDUCED_COLOR_2)
cv2.imshow('lean', img)
b = img[: , : , 0]
g = img[: , : , 1]
r = img[: , : , 2]
cv2.imshow('B',b)
cv2.imshow('G',g)
cv2.imshow('R',r)
cv2.waitKey(0)
cv2.destroyAllWindows()
(2) 使用cv2.split()函式拆分通道
img2 = cv2.imread('lena.jpg')
cv2.imshow('lean',img2)
b, g, r = cv2.split(img2)
cv2.imshow('B',b)
cv2.imshow('G',g)
cv2.imshow('R',r)
cv2.waitKey(0)
cv2.destroyAllWindows()
(3) 合并影像通道
rgb = cv2.merge([r, g, b]) # 彩色RGB
bgr = cv2.merge([b, g, r]) # OpenCV彩色BGR
gbr = cv2.merge([g, b, r])
cv2.imshow('RGB',rgb)
cv2.imshow('BGR',bgr)
cv2.imshow('GBR',gbr)
cv2.waitKey(0)
cv2.destroyAllWindows()
總結
??以上內容介紹了OpenCV-Python影像的基礎操作,有關Python、資料科學、人工智能等文章后續會不定期發布,請大家多多關注,一鍵三連喲(●’?’●),
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/375063.html
標籤:其他
上一篇:【OpenCV-Python】1.OpenCV的簡介、配置、檔案與示例
下一篇:Introspective Distillation for Robust Question Answering 論文筆記
