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))