2.3使用numpy.array访问像素

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

### 1.二值图像及灰度图像

可以将二值图像理解为特殊的灰度图像,所以这里仅以灰度图像为例讨论像素点值的读取
和修改。

函数 item() 能够更加高效地访问图像的像素点,该函数的语法格式为:

item(行,列)

函数 itemset() 可以用来修改像素值,其语法格式为:
itemset(索引值,新值)

为了便于理解,我们首先使用 Nmpy 库生成一个 5×5 大小的随机数组,用来模拟一幅灰度图像,并对其进行用简单的处理。

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

分析:使用 Numpy 中的 random.randint 可以生成一个随机数组,该随机数组对应一幅灰度图像。然后分别使用函数 item()及函数 itemset() 对其像素进行访问、修改

根据题目要求及分析,编写代码如下:


import 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=
[[83 19 42 12 58]
[87 10 77 76 23]
[22 87 81 56 83]
[70 49 55 27 41]
[90 96 40 43 23]]
读取像素点img.item(3,2)= 55
修改后img=
[[ 83 19 42 12 58]
[ 87 10 77 76 23]
[ 22 87 81 56 83]
[ 70 49 255 27 41]
[ 90 96 40 43 23]]
修改后像素点img.item(3,2)= 255

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

在例 2.7中,为方便读者仔细观察数组内的每一个值,生成的数组规模(尺寸)较小。
实际使用中,可以利用随机函数生成更大尺寸的随机数组,并使用函数 imshow() 观察随机数组对应的灰度图像

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

根据题目要求,编写代码如下:

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

运行结果如下,生成一副256*256大小的灰度图像


1561476207(1).png

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

根据题目要求,编写代码如下:


import cv2
img=cv2.imread("C:\\Users\\Administrator\\Desktop\\opencv\\lena.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()

运行结果如下:


1561476390(1).png

本程序首先修改了一个像素点的像素值:使用 item() 函数读取了第3 行第2 列位置的像素值:接下来使用 itemset 函数对该像或值进行了修改
接下来使用嵌套征环语句修改了一个区域的像值,将位于“第 10 行到第 90行”和“第80 列到第 99列”的行列交叉区域的像素值设置(修改)为 255,即让该区域星示为白色

2.彩色图像

我们也可以使用函数 item()和函数 itemset()来访问和修改彩色图像的像素值,过程与操作灰度图像相似,不同之处在于需要补充通道信息

函数 item() 访问 RGB 模式图像的像素值时,其语法格式为:
item(行,列,通道)

函数 itemset()修改(设置)RGB 模式图像的像素值时,其语法格式为:
itemset(三元组索引值,新值)

需要注意,针对 RGB 图像的访问,必须同时指定行、列以及行列索素引(通道),例如
img. item(a, b,c)仅仅指定行和列是不可以的

【例 2.10】使用 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))


运行结果如下

img=
[[[69 96 37]
[77 69 15]
[51 22 38]
[12 59 14]]

[[23 68 61]
[68 83 60]
[36 34 75]
[69 96 88]]]
读取像素点img[1,2,0]= 36
读取像素点img[0,2,1]= 22
读取像素点img[1,0,2]= 61
修改后img=
[[[ 69 96 37]
[ 77 69 15]
[ 51 255 38]
[ 12 59 14]]

[[ 23 68 255]
[ 68 83 60]
[255 34 75]
[ 69 96 88]]]
修改后像素点img[1,2,0]= 255
修改后像素点img[0,2,1]= 255
修改后像素点img[1,0,2]= 255

在本例中,为了方便读者纠致观察数内的值,生成的数组尺寸较小,在实际使用中,读者可以利用随机函数生成更大尺寸的随机数组,并使用函
cv2.imshow()观察随机数组对应的彩色图像

【例2.11】 生成一幅彩色图像,让其中的像素值均为随机数

根据口要求,编写代码如下

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

上述程序可以生成一幅 256×256×3 的彩色图像,显示的图像图 2-14 所示。由于本书为黑白印,所以为了更好地观察运行效果,请大家米自上机运行

1561477113(1).png

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

根据口要求,编写代码如下
import cv2
img=cv2.imread("C:\\Users\\Administrator\\Desktop\\opencv\\lenacolor.png")
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)
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))
cv2.waitKey()
cv2.destroyAllWindows()


在本程序中,首先,使用 iemO 函数读取了第0 行第0 列位置上的B 通道、G 通道、 R通道三个通道上的像素值;接着,使用 itemset函数对该值进行了修改:最后,使用嵌套循环语句将位于“第0 行到第 49行”和“第0 列到第9列”的交叉区域内的像素值设置为了 255 即让该区域显示为白色

运行上述程序,得到如图 215 所示结果,其中左图是读取的原始图像,右图是修改后的图像。由于本书为黑白印刷,所以为了更好地观察运行效果,请大家亲自上机运行程序

1561477676(1).png

访问img.item(0,0,0)= 125
访问img.item(0,0,1)= 137
访问img.item(0,0,2)= 226
修改后img.item(0,0,0)= 255
修改后img.item(0,0,1)= 255
修改后img.item(0,0,2)= 255

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容