使用工具Python3.5
使用包cv2,numpy
1.獲取并修改像素值
讀取一副圖像,根據像素的行和列的坐標獲取它的像素值,對于RGB圖像而言,返回RGB的值,對于灰度圖則返回灰度值
~~~
import cv2
import numpy
img = cv2.imread('45.jpg')
px=img[100,100]
print(px)
blue = img[100,100,0]
print(blue)
img[101,101]=[255,255,255]
print(img[101,101])
~~~
numpy是經過優化了的進行快速矩陣運算的包,所以不推薦逐個獲取像素值并修改能矩陣運算就不要用循環。
例如前5行的后3列,用numpy的array.item()和array.itemset()會更好。但是返回是標量,如果想獲得所有RGB的值,需要使用array.item()分割他們。
更好的方法是
~~~
import cv2
import numpy
img = cv2.imread('45.jpg')
print(img.item(10,10,2))
img.itemset((10,10,2),100)
print(img.item(10,10,2))
~~~
2.獲取圖像屬性
圖像屬性包括:行,列,通道,圖像數據類型,像素數目等
2.1 img.shape可以獲得圖像的形狀,返回值是一個包含行數,列數,通道數的元組
~~~
import cv2
import numpy
img = cv2.imread('45.jpg')
print(img.shape)
~~~
如果圖像是灰度圖,返回值僅有行數和列數,所以通過檢查返回值可以判斷是灰度圖還是彩色圖
2.2 img.size可以返回圖像的像素數目
~~~
import cv2
import numpy
img = cv2.imread('45.jpg')
print(img.size)
~~~
2.3 img.dtype返回圖像的數據類型,在debug時很重要,因為OpenCV-Python代碼中經常出現數據類型的不一致
~~~
import cv2
import numpy
img = cv2.imread('45.jpg')
print(img.dtype)
~~~
3.圖像ROI
對圖像的特定區域操作。ROI是使用numpy索引來獲得的。
例:選擇球的部分并拷貝到其他區域

~~~
import cv2
import numpy
img = cv2.imread('roi.jpg')
ball =img[20:30,30:30]
img[40:40,50:50]=ball
~~~
注意!!這里沒有找到原圖,大家可以試試自己做的圖,并且要先知道圖像尺寸,以及你要移動的圖像的像素坐標,可以使用matplotlib!!
4.拆分及合并圖像通道
有時需要對RGB三個通道分別操作,這就需要拆分RGB為單個通道。有時需要把獨立的通道的圖片合成一個RGB。
~~~
r,g,b=cv2.split(img)#拆分
img=cv2.merge(r,g,b)#合并
~~~
或者
~~~
b=img[:,:,0]#拆分b通道
~~~
假如想使所有紅色通道值都為0,不必拆分再賦值,可以使用numpy索引,這樣更快
~~~
img[:,:,2]=0
~~~
cv2.split()是比較耗時的操作,能用numpy就盡量使用。
5.為圖像擴邊(填充)
想為圖像周圍建一個邊可以使用cv2.copyMakeBorder()函數。這經常在卷積運算或0填充時被用到。具體參數如下:
5.1 src輸入圖像
5.2 top,bottom,left,right對應邊界的像素數目
5.3 borderType要添加哪種類型的邊界:
5.3.1 cv2.BORDER_CONSTANT添加有顏色的常數值邊界,還需要下一個參數(value)
5.3.2 cv2.BORDER_REFLIECT邊界元素的鏡像。例如:fedcba | abcdefgh | hgfedcb
5.3.3 cv2.BORDER_101或者cv2.BORDER_DEFAULT跟上面一樣,但稍作改動,例如:gfedcb | abcdefgh | gfedcba
5.3.4 cv2.BORDER_REPLICATE復后一個元素。例如: aaaaaa| abcdefgh|hhhhhhh
5.3.5 cv2.BORDER_WRAP 不知怎么了, 就像樣: cdefgh| abcdefgh|abcdefg
5.3.6 value邊界顏色
舉例說明
~~~
import cv2
import numpy
from matplotlib import pyplot as plt
img = cv2.imread('roi.jpg')
blue = [255,0,0]
replicate = cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_REFLECT101)
wrap = cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_CONSTANT,value=blue)
plt.subplot(231),plt.imshow(img,'gray'),plt.title('original')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('replicate')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('reflect')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('reflect101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('wrap')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('constant')
plt.show()
~~~

大家可以嘗試做做自己的圖片