Python+OpenCV教程4:圖像基本操作

目標

  • 訪問和修改圖片像素點的值
  • 獲取圖片的寬、高、通道數等屬性
  • 瞭解感興趣區域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
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章