在上一节中,介绍了如何访问和修改像素值,基于纯数组的手动操作有些麻烦。numpy.array提供了item()和itemset()来访问和修改像素值。这两个函数都是经过优化处理的,使用起来比较高效。

二值图像及灰度图像

二值图像本质上也是一种灰度图。这里直接使用灰度图像进行说明。

访问像素点:

item(行, 列)

修改像素点:

itemset(索引值, 新值)

这两个函数是独立的,直接单独使用某一个函数即可。

例: 读取一张灰度图像,并对像素值进行访问和修改。

import cv2
img = cv2.imread('mile.jpg', 0)  # 将图片以灰度图的方式打开
for i in range(10, 80):
    for j in range(30, 80):
        img.itemset((i, j), 255)  # 修改参数
cv2.imshow('After', img)
cv2.waitKey()

#注意你在网上下载的灰色图未必是灰度图,可能是“彩色图”,imread的时候以灰度图打开能确保

修改灰度图的像素

彩色图像

彩色图像与灰度图类似,不同之处在于需要补充通道消息。

item(行,列,通道)
itemset(三元组索引值,新值)

需要注意的是,针对RGB图像的访问,必须同时指定行、列及通道

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

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

随机数像素

这里用例子来简要介绍一下np.random.randint函数,该函数可以指定范围、生成矩阵的维数等。

>>> np.random.randint(1,20,size=3)
array([19, 18,  4])
>>> np.random.randint(1,20,size=(3,4))
array([[ 4,  8,  7, 13],
       [ 8, 19, 16,  1],
       [ 4,  4,  2, 18]])
>>> np.random.randint(20,size=5)
array([ 4, 19, 17, 17,  8])
>>> np.random.randint(1,size=5)
array([0, 0, 0, 0, 0])
>>> np.random.randint(2,size=5)
array([0, 0, 0, 1, 0])

例2:读取一张彩色图片,对其进行访问和修改

import cv2
import numpy as np
img = cv2.imread('food.jpg')
print("访问img.items(0,0,0)", img.item(0, 0, 0))
print("访问img.items(0,0,1)", img.item(0, 0, 1))
print("访问img.items(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("FOOD", img)
print("修改后img.items(0,0,0)", img.item(0, 0, 0))
print("修改后img.items(0,0,1)", img.item(0, 0, 1))
print("修改后img.items(0,0,2)", img.item(0, 0, 2))
cv2.waitKey()

修改彩色图片的像素


food

mile


博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2021/OpenCV4.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 05 月 24 日
如果觉得我的文章对你有用,请随意赞赏