2.3 使用numpy.array访问像素

numpy.array 提供了 item()itemset()函数来访问和修改像素值,而且这两个函数都是经过 优化处理的,能够更大幅度地提高处理效率。在访问及修改像素点的值时,利用 numpy.array 提供的函数比直接使用索引要快得多,同时,这两个函数的可读性也更好。

1. 二值图像及灰度图像

函数 item()能够更加高效地访问图像的像素点,该函数的语法格式为:
item(行,列)
函数 itemset()可以用来修改像素值,其语法格式为:
itemset(索引值,新值)

【例 2.7】使用 Numpy 生成一个二维随机数组,用来模拟一幅灰度图像,并对其像素进行 访问、修改。

 numpy as np
img = np.random.randint(10,99,size=[5,5],dtype=np.uint8)
print("img=\n",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))

通过观察输出结果可以发现,语句 img.itemset((3,2),255)将图像第 3 行第 2 列位置上的像素值修改为 255 了

【例 2.8】生成一个灰度图像,让其中的像素值均为随机数。

import cv2
img = np.random.randint(0,255,size=[256,256],dtype=np.uint8)
cv2.imshow("demo",img)
cv2.waitKey()
cv2.destroyAllWindows()

【例 2.9】读取一幅灰度图像,并对其像素值进行访问、修改。

img = cv2.imread("/Users/zhaofeier/Desktop/lenna.bmp",0)
#! 测试数据读取、修改单个像素值
print("读取像素点img.item(3,2)=",img.item(3,2))
img.itemset((3,2),255)
print("修改后像素点img.item(3,2)=",img.item(3,2))

#! 测试修改一个区域的像素值
cv2.imshow("before",img)
for i in range(10,100):
    for j in range(80,100):
        img.itemset((i,j),255)
        
cv2.imshow("after",img)
cv2.waitKey()
cv2.destroyAllWindows()

2. 彩色图像

我们也可以使用函数 item()和函数 itemset()来访问和修改彩色图像的像素值,过程与操作度图像相似,不同之处在于需要补充通道信息。
函数 item()访问 RGB 模式图像的像素值时,其语法格式为:
item(行,列,通道)
函数 itemset()修改(设置)RGB 模式图像的像素值时,其语法格式为:
itemset(三元组索引值,新值)
需要注意,针对 RGB 图像的访问,必须同时指定行、列以及行列索引(通道),例如img.item(a,b,c)。仅仅指定行和列是不可以的。

【例 2.10】使用 Numpy 生成一个由随机数构成的三维数组,用来模拟一幅 RGB 色彩空间的彩色图像,并使用函数 item()和 itemset()来访问和修改它。

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.11】生成一幅彩色图像,让其中的像素值均为随机数。

img = np.random.randint(0,255,size=[256,256,3],dtype=np.uint8)
cv2.imshow("demo",img)
cv2.waitKey()
cv2.destroyAllWindows()

【例 2.12】读取一幅彩色图像,并对其像素进行访问、修改。

img = cv2.imread("/Users/zhaofeier/Desktop/lenna.bmp")
cv2.imshow("before",img)
print("访问 img.item(0,0,0)=",img.item(0,0,0)) 
print("访问 img.item(0,0,1)=",img.item(0,0,1))
print("访问 img.item(0,0,2)=",img.item(0,0,2))

for i in range(0,50):
    for j in range(0,100):
        for k in range(0,3):
            img.itemset((i,j,k),255)    #?白色

cv2.imshow("after",img)
cv2.waitKey()
cv2.destroyAllWindows()
print("修改后 img.item(0,0,0)=",img.item(0,0,0)) 
print("修改后 img.item(0,0,1)=",img.item(0,0,1)) 
print("修改后 img.item(0,0,2)=",img.item(0,0,2))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暮棂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值