1. 程式人生 > >OpenCV學習系列:

OpenCV學習系列:

最近需要對資料進行擴增以獲得更為豐富的資訊,就來了解一下OpenCV。以後每天會寫一點自己的學習要點:

1、對影象進行操作需要先獲取影象的畫素值矩陣,用cv2.imread('xxx.jpg')函式來獲取一個影象的畫素矩陣:

>>> import cv2
>>> import numpy as np

>>> img = cv2.imread('messi5.jpg')

如果是灰度圖片,如mnist grayscale image,則畫素矩陣的每個元素就是0~255的畫素值;如果是BGR彩色影象,則每個位置是一個[blue,green,red]的陣列。

>>> px = img[100,100]
>>> print px
[157 166 200]

# accessing only blue pixel
>>> blue = img[100,100,0]
>>> print blue
157


# accessing RED value
>>> img.item(10,10,2)
59

# modifying RED value
>>> img.itemset((10,10,2),100)
>>> img.item(10,10,2)
100

2、獲取影象屬性:“知己知彼,方能百戰百勝”——如果一開始我們不瞭解這個影象的情況可能後面的操作就沒法進行,比如影象的行數(高)、列數(寬),影象的資料型別、畫素數量等等;影象的shape可以直接用img.shape 得到,返回一個由行數和列陣列成的元組,如果是BGR影象還會顯示通道數“3”,即變成了三元組:

>>> print img.shape
(342, 548, 3)

>>> print img.size  # number of pixels
562248

>>> print img.dtype # image datatype 
uint8

3.分離、合併影象通道:

有時候我們需要只在影象的某一通道進行操作,就需要把那一通道的畫素值提取出來:

>>> b,g,r = cv2.split(img)
>>> img = cv2.merge((b,g,r))

或者:

>>> b = img[:,:,0]

或者你想讓所有的red pixels值為0:

>>> img[:,:,2] = 0

要注意的是cn2.split() 函式是一個很費時的操作,如非必要,考慮使用 Numpy indexing.

4、裁剪、移動影象的某一部分:

如圖,把足球平移到另一個文置:

>>> ball = img[280:340, 330:390]
>>> img[273:333, 100:160] = ball

Image ROI