OpenCV 入門教程:
OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺庫,廣泛應用于圖像處理、視頻分析、機器學習等領域。
在 Python 中,cv2
是 OpenCV 的主要接口模塊。本文將帶你一步步掌握 cv2
庫的安裝與基本圖像處理功能。
圖像的本質:像素的數字矩陣
任何數字圖像(如照片、截圖、手寫數字圖片)都是由無數個微小的 “像素點”(Pixel)組成的
-
每個像素點的數值含義:
- 對于灰度圖(如代碼中的手寫數字),每個像素用一個 0-255 的整數表示亮度:0 代表純黑,255 代表純白,中間值表示不同深淺的灰色。
- 對于彩色圖(如 RGB 格式),每個像素由三個數值(R、G、B)組成,分別對應紅、綠、藍三種顏色的亮度,組合后呈現出各種顏色。
彩色圖的單個像素點:[0-255,0-255,0-255]:
如:[123, 85, 34]↑ ↑ ↑B G R
在 OpenCV 中默認是 BGR,而不是 RGB
灰度圖示例:
什么是RGB(Red, Green, Blue):
光學三原色(RGB):紅、綠、藍
通過將紅色(R)、綠色(G)、藍色(B)三種顏色以不同強度組合,形成各種顏色。
R | G | B | 顏色 |
---|---|---|---|
255 | 0 | 0 | 紅色 |
0 | 255 | 0 | 綠色 |
0 | 0 | 255 | 藍色 |
255 | 255 | 255 | 白色 |
0 | 0 | 0 | 黑色 |
255 | 255 | 0 | 黃色 |
百度搜索 “RGB調色板” ,我們通過調色來具體對比來看看:
將第一個像素對應的R、G、B輸入調色板后得到的顏色? 與? 像素切片篇左上角的像素顏色? 相同:
注意:這里的三個數組并不是直接 print(image) 打印出來的結果。
print打印出來的結果是
而是分離通道:(本文章第七節會教,此處有印象即可)
B = img1[:, :, 0] ? # 藍色B通道
G = img1[:, :, 1] ? # 綠色G通道
R = img1[:, :, 2] ? # 紅色R通道或者:
B, G, R = cv2.split(img1)得到被分開的R、G、B的單獨的顏色數據,同時數據的位置對應每個像素的位置。
一、安裝 OpenCV 并查看版本
安裝命令
pip install opencv-python
pip install opencv-contrib-python
?? 注意:
opencv-contrib-python
是包含更多實驗性模塊和擴展功能的版本,如果你需要 SIFT、SURF 等模塊,可安裝:
安裝完成后,可以通過如下方式驗證 OpenCV 是否成功安裝:
import cv2
print("OpenCV 版本:", cv2.__version__)
二、讀取與顯示圖像(解析圖像的矩陣)
完整圖片(可保存):(或者直接百度搜索企鵝,在點開圖片欄,應該第一個或第二個就是)
該圖片的第一行的數字矩陣:
可以看到數字矩陣有1600行,3列
1600表示這個圖片一行有1600個像素點
3表示每個像素點的BGR的數字組成
import cv2
img = cv2.imread("penguin.jpg")
# print(img) #打印圖片的數字矩陣(設置斷點,調試時可以更直觀)cv2.imshow('qie',img)
a = cv2.waitKey(5000) # 展示5秒時間(參數為0:一直執行,需要按鍵關閉)
print(a) # 如果按下按鍵,獲取按鍵的ascll碼值
cv2.destroyAllWindows() # 關閉所有打開的窗口并釋放所有相關內存。print("圖像形狀(shape):",img.shape)
print("圖像數據類型(dtype)",img.dtype)
print("圖像大小(size)",img.size)
說明:
-
cv2.imread()
:讀取圖像。 -
cv2.imshow()
:展示圖像窗口。單引號‘’內為標題 -
cv2.waitKey(ms)
:等待鍵盤事件,單位為毫秒。若為0
,表示一直等待。 -
cv2.destroyAllWindows()
:關閉所有窗口。 -
img.shape
:返回圖像的尺寸(高度, 寬度, 通道數)
。
結果:
圖像形狀(shape):(1200, 1600, 3)
數字 | 含義 |
---|---|
1200 | 圖像的高度(行數)= 有 1200 像素行 |
1600 | 圖像的寬度(列數)= 有 1600 像素列 |
3 | 每個像素有 3 個通道(通常為 BGR 或 RGB) |
該圖像是一個 彩色圖像(3通道),大小為 1600(列)×1200(行) 像素,使用的是 BGR 色彩空間(在 OpenCV 中默認是 BGR,而不是 RGB)。
圖像數據類型(dtype): uint8
-
uint8
是 無符號 8 位整數(unsigned int 8)。 -
每個像素的每個通道用一個字節(8 位)來表示。
-
取值范圍是 0 ~ 255。
圖像大小(size) 5760000
-
shape
為(1200, 1600, 3)
:-
高度(行數):1200 像素
-
寬度(列數):1600 像素
-
每個像素有 3 個顏色通道(B、G、R)
-
-
dtype
為uint8
(每個通道值占 1 字節)
那么:
size = 1200 × 1600 × 3 = 5760000
所以,這個圖像共有 5760000 個像素值(也可以理解為字節數)。
三、圖像縮放
import cv2
img = cv2.imread('penguin.jpg')
img_resize = cv2.resize(img, (400, 400))
cv2.imshow('img',img)
cv2.imshow('img_resize',img_resize)
cv2.waitKey(0)
cv2.destroyAllWindows()
說明:
-
cv2.resize()
支持調整圖像分辨率,常用于適配模型或顯示需求。
四、讀取灰度圖像并保存
讀取圖片時直接處理成灰度
import cv2
img = cv2.imread(r'./penguin.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('penguin_gray',img)
a = cv2.waitKey(0)
print(a)
cv2.destroyAllWindows()print("圖像形狀(shape):",img.shape)
print("圖像數據類型(dtype)",img.dtype)
print("圖像大小(size)",img.size)cv2.imwrite('penguin_gray.jpg', img) #保存灰度圖片
或:
讀取彩色圖片后,cv2.cvtColor()進行顏色空間轉換
img = cv2.imread('penguin.jpg')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
說明:
-
使用
cv2.IMREAD_GRAYSCALE
可將圖像讀取為灰度格式。 -
cv2.cvtColor()
進行顏色空間轉換。 -
cv2.imwrite()
用于保存圖像。
五、圖像裁剪
import cv2
img1 = cv2.imread('penguin.jpg')
img2 = img1[150:350,500:700]
cv2.imshow('penguin',img1)
cv2.imshow('penguin_head',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
說明:
-
圖像裁剪可通過 NumPy 的數組切片完成。
六、讀取視頻文件或攝像頭
import cv2
video_capture = cv2.VideoCapture('video1.mp4') # 若參數為0,則為攝像頭
if not video_capture.isOpened():print("無法打開")exit()
while True:ret, frame = video_capture.read()if not ret:breakframe = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)cv2.imshow('Video', frame)if cv2.waitKey(1) == 27: # 數字為每一幀的間隔break
video_capture.release()
cv2.destroyAllWindows()
攝像頭讀幀:video_capture = cv2.VideoCapture(0)
說明:
-
cv2.VideoCapture()
可打開視頻文件或0攝像頭。 -
video_capture.isOpened()
:檢查攝像頭是否成功打開,返回True
(成功)或False
(失敗)。 -
cv2.cvtColor()
進行顏色空間轉換。 -
ret, frame = video_capture.read()
video_capture.read()
:從攝像頭讀取一幀圖像。- 返回兩個值:
ret
是布爾值(True
表示讀取成功,False
表示失敗,如攝像頭斷開);frame
是讀取到的圖像幀(numpy 數組格式)。
七、分離與合并顏色通道
分離通道指的是將一個三通道彩色圖像拆成 三個單通道灰度圖
所以每個圖只表示一個顏色成分的強度(所有顏色都由紅藍綠三原色組成)
import cv2
img1 = cv2.imread('penguin.jpg')
# =====分離顏色通道=====
# 兩種分離方式:
# B = img1[:, :, 0] # 藍色B通道
# G = img1[:, :, 1] # 綠色G通道
# R = img1[:, :, 2] # 紅色R通道
B, G, R = cv2.split(img1)
cv2.imshow('B', B)
cv2.imshow('G', G)
cv2.imshow('R', R)
cv2.waitKey(0)
# =====合并顏色通道=====
img2 = cv2.merge([B, G, R])
cv2.imshow('RGB', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
說明:
-
cv2.split()
分離 B、G、R 通道。 -
cv2.merge()
合并通道生成彩色圖像。
通過調試觀察數據組成:
可以看到數據的上面是
八、區域像素替換與圖像合成
7.1 用隨機像素填充圖像區域(打碼):
import cv2
import numpy as np
img = cv2.imread('penguin.jpg')
img[150:350,500:700] = np.random.randint(0,256,(200,200,3))
cv2.imshow('penguin_head',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
7.2 圖像區域拷貝與粘貼(換頭):
import cv2
img1 = cv2.imread('penguin.jpg')
img2 = cv2.imread('penguin.jpg')# head = img1[150:350,500:700]
# img2[250:450,1000:1200] = head
head = img1[250:450,1000:1200]
img2[150:350,500:700] = headcv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
說明:
-
通過數組操作,可輕松實現區域復制與圖像拼接。
總結
通過本教程,我們學習了 OpenCV 的以下基礎內容:
功能 | 使用方法 |
---|---|
圖像讀取 | cv2.imread() |
圖像展示 | cv2.imshow() |
灰度圖轉換 | cv2.IMREAD_GRAYSCALE 、cv2.cvtColor() |
圖像裁剪 | NumPy 切片 |
視頻讀取 | cv2.VideoCapture() |
通道分離與合并 | cv2.split() 、cv2.merge() |
圖像縮放 | cv2.resize() |
圖像保存 | cv2.imwrite() |