OpenCV-Python[第三章]——影象格式及操作方法
阿新 • • 發佈:2019-02-09
理解影象
影象其實就是一個2維陣列,因此可以使用行列座標對影象畫素點進行定位。對於彩色影象,每個畫素點對應的是一個包含bgr(cv2.imread讀取的影象為BGR模式)的三元素的陣列,灰度影象則每個畫素對應一個灰度值。
px = img[100,100] #access pixel
print px #print the pilxe value
此外,可以使用陣列的切片操作訪問影象區域(ROI)
ball = img[280:340,330:390]
img[273:333,100:160] = ball
前面提到可以使用cv2.split獲取顏色分量,在知道影象其實就是二維陣列之後,還可以使用切片操作獲取影象分量。
blue = img[:,:,0]
green = img[:,:,1]
red = img[:,:,2]
完整程式碼
import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('messi5.jpg',1) # read as bgr color mode
px = img[100,100]
print px
ball = img[280:340,330:390]
img[273:333,100:160] = ball
b,g,r = cv2.split(img)
img2 = cv2.merge((r,g,b))
blue = img[:,:,0 ]
green = img[:,:,1]
red = img[:,:,2]
img3 = cv2.merge((red,green,blue))
cv2.imshow('image',img)
plt.subplot(121);plt.imshow(img2)
plt.subplot(122);plt.imshow(img3)
plt.show()
k = cv2.waitKey(0)
if k == 27: # wait for ESC key to exit
cv2.destroyAllWindows()
elif k == ord('s'): # wait for 's' key to save and exit
cv2.imwrite('messigray.png',img)
cv2.destroyAllWindows()
補充說明
除了使用python的陣列操作訪問影象畫素,還可以使用影象的成員函式item/itemset,進行畫素的訪問與修改。但這種方法只能訪問一個畫素的一種顏色。如果是彩色影象,需要分別對bgr進行訪問與修改。
px = img.item(0,0,2) # red
print px
img.itemset((0,0,2),100)
print img.item(0,0,2)