图像处理基础
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 cv2import 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的顺序存储的。
通道拆分
- 通过索引拆分
g = img[ : , : , 1 ]
r = img[ : , : , 2 ]
- 通过函数拆分
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(img.shape)
print(img.size)
print(img.dtype)
----------------------
图像的属性
(5, 5)
25
uint8
例子
import cv2import 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)