opencv-06 使用numpy.array 操作图片像素值

opencv-06 使用numpy.array 操作图片像素值

    • **1.二值图像及灰度图像**
    • **利用item 读取某一个像素值**
    • **利用itemset 修改像素值**
    • **彩色图像numpy.arry 像素值操作**

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] 有比较好的图感效果,帮助理解三维数组中这几个数字的含义
opencv-06 使用numpy.array 操作图片像素值_第1张图片

运行结果:

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之间的整数。

你可能感兴趣的:(opencv,opencv,numpy,人工智能)