opencv-06 使用numpy.array 操作图片像素值
numpy.array 提供了 item()和 itemset()函数来访问和修改像素值,而且这两个函数都是经过
优化处理的,能够更大幅度地提高处理效率。在访问及修改像素点的值时,利用 numpy.array
提供的函数比直接使用索引要快得多,同时,这两个函数的可读性也更好。
1.二值图像及灰度图像
可以将二值图像理解为特殊的灰度图像,所以这里仅以灰度图像为例讨论像素点值的读取
和修改。
函数 item()能够更加高效地访问图像的像素点,该函数的语法格式为:
item(行,列)
函数 itemset()可以用来修改像素值,其语法格式为:
itemset(索引值,新值)
为了便于理解,我们首先使用 Numpy 库生成一个 5×5 大小的随机数组,用来模拟一幅灰度图像,并对其进行简单的处理。
import numpy as np
img=np.random.randint(10,99,size=[5,5],dtype=np.uint8)
print(img)
生成一个5行5列 10到99 随机数的像素值的矩阵
打印结果:
[[67 39 26 43 23]
[61 42 80 91 19]
[39 80 58 72 62]
[94 45 73 47 31]
[97 39 19 92 59]]
利用item 读取某一个像素值
示例 item(3.2)
代码演示:
import numpy as np
img=np.random.randint(10,99,size=[5,5],dtype=np.uint8)
print(img)
print("读取像素点 img.item(3,2)=",img.item(3,2))
打印结果:
[[97 51 42 58 68]
[21 37 70 92 76]
[38 69 53 21 44]
[69 15 24 71 32]
[12 82 96 50 97]]
读取第四行第三列的像素值 img.item(3,2)= 24
利用itemset 修改像素值
img.itemset((3,2),255)
import numpy as np
img=np.random.randint(10,99,size=[5,5],dtype=np.uint8)
print(img)
print("读取像素点 img.item(3,2)=",img.item(3,2))
img.itemset((3,2),255)
print("修改后 img=\n",img)
print("修改后像素点 img.item(3,2)=",img.item(3,2))
打印结果:
[[70 59 31 93 22]
[16 10 66 68 50]
[77 60 92 62 30]
[61 45 93 98 79]
[66 27 34 60 63]]
读取像素点 img.item(3,2)= 93
修改后 img=
[[ 70 59 31 93 22]
[ 16 10 66 68 50]
[ 77 60 92 62 30]
[ 61 45 255 98 79]
[ 66 27 34 60 63]]
修改后像素点 img.item(3,2)= 255
通过观察输出结果可以发现,语句 img.itemset((3,2),255)将图像第 4 行第 3 列位置上的像素值修改为 255 了
彩色图像numpy.arry 像素值操作
我们也可以使用函数 item()和函数 itemset()来访问和修改彩色图像的像素值,过程与操作
灰度图像相似,不同之处在于需要补充通道信息。
函数 item()访问 RGB 模式图像的像素值时,其语法格式为:
item(行,列,通道)
函数 itemset()修改(设置)RGB 模式图像的像素值时,其语法格式为:
itemset(三元组索引值,新值)
需要注意,针对 RGB 图像的访问,必须同时指定行、列以及行列索引(通道),例如
img.item(a,b,c)。仅仅指定行和列是不可以的。
实操:
使用 Numpy 生成一个由随机数构成的三维数组,用来模拟一幅 RGB 色彩空间
的彩色图像,并使用函数 item()和 itemset()来访问和修改它
import numpy as np
img=np.random.randint(10,99,size=[2,4,3],dtype=np.uint8)
print("img=\n",img)
print("读取像素点 img[1,2,0]=",img.item(1,2,0))
print("读取像素点 img[0,2,1]=",img.item(0,2,1))
print("读取像素点 img[1,0,2]=",img.item(1,0,2))
img.itemset((1,2,0),255)
img.itemset((0,2,1),255)
img.itemset((1,0,2),255)
print("修改后 img=\n",img)
print("修改后像素点 img[1,2,0]=",img.item(1,2,0))
print("修改后像素点 img[0,2,1]=",img.item(0,2,1))
print("修改后像素点 img[1,0,2]=",img.item(1,0,2))
这段代码创建了一个形状为(2, 4, 3)的NumPy数组img,其中包含了随机生成的8位无符号整数(uint8)类型的数据。这个数组模拟了一个彩色图像,具有2个高度、4个宽度和3个通道(红、绿、蓝)。
使用np.random.randint()函数生成随机整数,指定了整数范围为10到99之间。size=[2, 4, 3]参数定义了数组的形状为(2, 4, 3),即2个高度、4个宽度和3个通道
网上看到这个图,对 上述中 size=[2,4,3] 有比较好的图感效果,帮助理解三维数组中这几个数字的含义
运行结果:
img=
[[[98 63 26]
[49 64 50]
[62 36 65]
[75 77 61]]
[[11 87 47]
[69 93 27]
[80 24 35]
[81 97 73]]]
读取像素点 img[1,2,0]= 80
读取像素点 img[0,2,1]= 36
读取像素点 img[1,0,2]= 47
修改后 img=
[[[ 98 63 26]
[ 49 64 50]
[ 62 255 65]
[ 75 77 61]]
[[ 11 87 255]
[ 69 93 27]
[255 24 35]
[ 81 97 73]]]
修改后像素点 img[1,2,0]= 255
修改后像素点 img[0,2,1]= 255
修改后像素点 img[1,0,2]= 255
这个输出展示了一个形状为(2, 4, 3)的NumPy数组,表示了两个2x4的像素块,每个像素块包含3个通道(红、绿、蓝)。每个像素值都是随机生成的介于10到99之间的整数。