numpy 访问图像
Numpy.array库是Python处理图像的基础。
在OpenCV中,通道的顺序是B→G→R
在OpenCV中,最小的数据类型是无符号的8位数
可以使用image[0,0]访问图像image第0行第0列位置上的像素点
先行后列: img[行,列]
使用Numpy库中的函数zeros()可以生成一个元素值都是0的数组,并可以直接使用数组的索引对其进行访问、修改。
img=np.zeros((8,8), dtype=np.uint8)
RGB模式的彩色图像在读入OpenCV内进行处理时,会按照行方向依次读取该RGB图像的B通道、G通道、R通道的像素点,并将像素点以行为单位存储在ndarray的列中。
在OpenCV内以BGR模式的三维数组形式存储
可以使用表达式访问数组内的值。
例如,可以使用image[0,0,0]访问图像image的B通道内的第0行第0列上的像素点,式中:
● 第1个索引表示第0行。
● 第2个索引表示第0列。
● 第3个索引表示第0个颜色通道。
绿色通道值 : green[:, :,1]=255
item()和itemset()
使用numpy.array访问像素
numpy.array提供了item()和itemset()函数来访问和修改像素值
函数item()能够更加高效地访问图像的像素点,该函数的语法格式为:
item(行,列)
函数itemset()可以用来修改像素值,其语法格式为:
itemset(索引值,新值)
import cv2 import numpy as np //使用Numpy中的random.randint可以生成一个随机数组 img = np.random.randint(10,99,size=[5,5],dtype=np.uint8) value = img.item(3,2) img.itemset((3,2),255) print(value) print(img)
函数item()访问RGB模式图像的像素值时,其语法格式为:
item(行,列,通道)
函数itemset()修改(设置)RGB模式图像的像素值时,其语法格式为:
itemset(三元组索引值,新值)
需要注意,针对RGB图像的访问,必须同时指定行、列以及行列索引(通道),例如img.item(a, b, c)。
仅仅指定行和列是不可以的。
感兴趣区域
ROI: Region of Interest, ROI
将一个感兴趣区域A赋值给变量B后,可以将该变量B赋值给另外一个区域C,从而达到在区域C内复制区域A的目的。
获取右侧的ROI: img[200:400,600:800] 先行后列
通道操作
Opencv中通道是按B->G->R的顺序存储的。
通道拆分
- 通过索引拆分
b = img[ : , : , 0 ] g = img[ : , : , 1 ] r = img[ : , : , 2 ]
- 通过函数拆分
b, g, r=cv2.split(img) b=cv2.split(a)[0] g=cv2.split(a)[1] r=cv2.split(a)[2]
通道合并
bgr=cv2.merge([b, g, r])
获取图像属性
- shape
如果是彩色图像,则返回包含行数、列数、通道数的数组
如果是二值图像或者灰度图像,则仅返回行数和列数。 - size
返回图像的像素数目。其值为“行×列×通道数”,灰度图像或者二值图像的通道数为1。 - dtype
返回图像的数据类型
print("图像的属性") print(img.shape) print(img.size) print(img.dtype) ---------------------- 图像的属性 (5, 5) 25 uint8
例子
import cv2 import numpy as np img = np.random.randint(10,99,size=[5,5,3],dtype=np.uint8) value = img.item(3,2,0) img.itemset((3,2,0),255) print("-----------") print("img") print(img) print("-----------") print("split") b,g,r = cv2.split(img) print("b") print(b) print("g") print(g) print("r") print(r) print("-----------") print("merge") img_m = cv2.merge([b,g,r]) print(img_m) print("-----------") print("图像的属性") print(img.shape) print(img.size) print(img.dtype)