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