目標
- 訪問和修改圖片像素點的值
- 獲取圖片的寬、高、通道數等屬性
- 瞭解感興趣區域ROI
- 分離和合並圖像通道
教程
獲取和修改像素點值
我們先讀入一張圖片:
import cv2
img = cv2.imread('lena.jpg')
通過行列的座標來獲取某像素點的值,對於彩色圖,這個值是B,G,R三個值的列表,對於灰度圖,只有一個值:
px = img[100, 100]
print(px) # [119 108 201]
# 只獲取藍色blue通道的值
px_blue = img[100, 100, 0]
print(px_blue) # 119
經驗之談:還記得嗎?行對應的是y,列對應的是x,所以其實是
img[y, x]
,需要注意噢(●ˇ∀ˇ●)
修改像素的值也是同樣的方式:
img[100, 100] = [255, 255, 255]
print(img[100, 100]) # [255 255 255]
經驗之談:還有一種性能更好的方式,獲取:
img.item(100,100,0)
,修改:img.itemset((100,100,0),255)
,但這種方式只能B,G,R逐一進行
圖片屬性
img.shape
獲取圖像的形狀,圖片是彩色的話,返回一個包含高度、寬度和通道數的元組,灰度圖只返回高度和寬度:
print(img.shape) # (263, 263, 3)
# 形狀中包括高度、寬度和通道數
height, width, channels = img.shape
# img是灰度圖的話:height, width = img.shape
img.dtype
獲取圖像數據類型:
print(img.dtype) # uint8
經驗之談:很多錯誤都是因爲數據類型不對導致的,所以健壯的代碼需要對這個屬性加以判斷
img.size
獲取圖像總像素數:
print(img.size) # 263*263*3=207507
ROI
ROI:region of interest,感興趣區域。什麼意思呢?比如我們要檢測眼睛,因爲眼睛肯定在臉上,所以我們感興趣的只有臉這部分,其他不需要關注,這樣就可以大大節省計算量,提高運行速度。
只關注臉( ╯□╰ )
截取ROI非常簡單,指定圖片的範圍即可:
# 截取臉部ROI
face = img[100:200, 115:188]
cv2.imshow('face', face)
cv2.waitKey(0)
通道分割與合併
彩色圖的BGR三個通道是可以分開單獨訪問的,也可以將單獨的三個通道合併成一副圖像。分別使用cv2.split()
和cv2.merge()
:
b, g, r = cv2.split(img)
img = cv2.merge((b, g, r))
split()函數比較耗時,更高效的方式是用numpy的索引,如提取B通道:
b = img[:, :, 0]
cv2.imshow('blue', b)
cv2.waitKey(0)
小結
- img[y,x]獲取/設置像素點值,img.shape:圖片的形狀(高度、寬度、通道數),img.dtype:圖像的數據類型
- img[y1:y2,x1:x2]進行ROI截取,cv2.split()/cv2.merge()通道分割/合併。更推薦的獲取單通道方式:b = img[:, :, 0]
作者:ex2tron
鏈接:https://www.jianshu.com/p/907f69b00f5b
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。