numpy.array类对数组的操作进行了极大的优化,它允许某些类型的批量操作,而这些操作在普通的python列表中是不可用的。这些类型的numpy.array都是opencv中特定于数组类型的操作,对于图像操作来说很方便。
import cv2
img = cv2.imread('010.jpg')
img[0,0] = [255,255,255]
cv2.imwrite('001.jpg',img)
上述图片是将坐标(0,0)的点转化为白色,不过这里笔者使用的图片本身不太明显也就没有加上
import cv2
img = cv2.imread('010.jpg')
img[: ,: ,1] = 0
cv2.imwrite("011.jpg",img)
这一块则是程序从所有行、列中获取所有像素,并把绿色值(在BGR数组的一个索引处)设置为0,通过下面的图片可以看到绿色已经完全消失了。
如果要修改某一特定像素的蓝色值,还可以使用item方法,它有三个参数:x(或者left)位置,y(或者top)位置以及数组中(x,y)位置的索引(在BGR图像中,某个特定位置处的数据是一个三元数组,包含按照BGR顺序排列的值),并返回索引位置的值。另一个方法itemset可以将某一特定像素的特定通道的值设置为指定的值。itemset有两个参数:三元组(x,y和索引)以及新值。
import cv2
img = cv2.imread('010.jpg')
img.itemset((200,340,0),255)
print(img.item((200,340,0)))
cv2.imwrite("011.jpg",img)
通过NumPy的数组切片操作,我们可以定义感兴趣区域(Region Of Interset,ROI),并对此区域进行一系列操作。
import cv2
img = cv2.imread('010.jpg')
my_roi = img[0:100,0:100]
img[300:400,300:400] = my_roi #注意两个区域大小必须保持一致
cv2.imwrite("011.jpg",img)
效果如下:
最后则是学习numpy.array的属性
import cv2
img = cv2.imread('010.jpg')
print(img.shape)
print(img.size)
print(img.dtype)
三个属性定义如下:
- shape:描述数组形状的一个元组。对于图像,它(依次)包括高度、宽度、通道数(如果是彩色图像)。shape元组的长度是确定图像是灰度还是彩色的一种有用方法。对于灰度图像,len(shape)==2,对于彩色图像,len(shape)==3。
- size:数组中的元素数。对于灰度图像,这和像素数是一样的。对于BGR图像,他是像素数的3倍,因为每个像素都由3个元素(B、G和R)表示。
- dtype:数组元素的数据类型。对于每个通达8位的图像,数据类型是numpy.uint8.