基于numpy.array对图像的数据访问(一)

这篇博客介绍了如何利用numpy.array对图像进行优化操作,包括批量改变像素值、设置特定通道的值以及使用item方法修改特定像素。还展示了如何通过数组切片实现感兴趣区域的选择与复制,并学习了numpy.array的shape、size和dtype属性。示例代码演示了在OpenCV中读取、修改和保存图像的方法。
摘要由CSDN通过智能技术生成

numpy.array类对数组的操作进行了极大的优化,它允许某些类型的批量操作,而这些操作在普通的python列表中是不可用的。这些类型的numpy.array都是opencv中特定于数组类型的操作,对于图像操作来说很方便。

import cv2

img = cv2.imread('010.jpg')
img[0,0] = [255,255,255]
cv2.imwrite('001.jpg',img)

上述图片是将坐标(0,0)的点转化为白色,不过这里笔者使用的图片本身不太明显也就没有加上

import cv2

img = cv2.imread('010.jpg')
img[: ,: ,1] = 0
cv2.imwrite("011.jpg",img)

这一块则是程序从所有行、列中获取所有像素,并把绿色值(在BGR数组的一个索引处)设置为0,通过下面的图片可以看到绿色已经完全消失了。 

 如果要修改某一特定像素的蓝色值,还可以使用item方法,它有三个参数:x(或者left)位置,y(或者top)位置以及数组中(x,y)位置的索引(在BGR图像中,某个特定位置处的数据是一个三元数组,包含按照BGR顺序排列的值),并返回索引位置的值。另一个方法itemset可以将某一特定像素的特定通道的值设置为指定的值。itemset有两个参数:三元组(x,y和索引)以及新值。

import cv2

img = cv2.imread('010.jpg')
img.itemset((200,340,0),255)
print(img.item((200,340,0)))
cv2.imwrite("011.jpg",img)

通过NumPy的数组切片操作,我们可以定义感兴趣区域(Region Of Interset,ROI),并对此区域进行一系列操作。

import cv2

img = cv2.imread('010.jpg')
my_roi = img[0:100,0:100]
img[300:400,300:400] = my_roi  #注意两个区域大小必须保持一致
cv2.imwrite("011.jpg",img)

效果如下:

 最后则是学习numpy.array的属性

import cv2

img = cv2.imread('010.jpg')
print(img.shape)
print(img.size)
print(img.dtype)

 三个属性定义如下:

  1. shape:描述数组形状的一个元组。对于图像,它(依次)包括高度、宽度、通道数(如果是彩色图像)。shape元组的长度是确定图像是灰度还是彩色的一种有用方法。对于灰度图像,len(shape)==2,对于彩色图像,len(shape)==3。
  2. size:数组中的元素数。对于灰度图像,这和像素数是一样的。对于BGR图像,他是像素数的3倍,因为每个像素都由3个元素(B、G和R)表示。
  3. dtype:数组元素的数据类型。对于每个通达8位的图像,数据类型是numpy.uint8.

1. Numpy简介: NumpyPython中常用的科学计算工具包,它提供了高性能的多维数组对象和基于数组的计算方法。Numpy中的数组可以是多维的,可以进行各种基本的数学运算,如加、减、乘、除等。此外,Numpy还提供了许多高级的数学函数和线性代数运算函数。 2. Numpy中的数组Numpy中的数组对象称为ndarray,它是一个多维数组对象。ndarray中的元素必须是相同类型的,这样可以提高数组的存储效率和计算效率。ndarray可以通过多种方式创建,如使用numpy.array()函数、numpy.zeros()函数、numpy.ones()函数等。 3. Numpy中的数组运算: Numpy中的数组支持各种基本的数学运算,如加、减、乘、除等。Numpy中的运算符是按元素进行操作的,这意味着两个数组的相同位置的元素进行运算。此外,Numpy还提供了许多高级的数学函数和线性代数运算函数,如sin()、cos()、exp()、dot()等。 4. Numpy中的索引和切片: Numpy中的索引和切片与Python中的列表和字符串的索引和切片类似。可以使用整数索引和切片操作来访问数组中的元素。在ndarray中,可以使用冒号(:)进行切片,还可以使用布尔索引和花式索引来访问数组中的元素。 5. Numpy中的广播: Numpy中的广播是指在进行二元运算时,如果两个数组的形状不同,Numpy会自动将较小的数组进行扩展,使得它们的形状相同,从而进行运算。广播可以减少代码的复杂度,提高代码的效率。 6. Numpy中的随机数: Numpy中的随机数生成函数提供了多种生成随机数的方法。可以生成各种类型的随机数,如均匀分布的随机数、正态分布的随机数、泊松分布的随机数等。Numpy中的随机数生成函数是通过调用随机数生成器来生成随机数的。 7. Numpy中的文件操作: Numpy中的文件操作包括读取和写入数组数据Numpy提供了几种文件格式,如文本文件、二进制文件、Numpy自有的.npz文件等。可以使用numpy.load()函数从文件中读取数据,使用numpy.save()函数将数据写入文件中。 8. Numpy中的线性代数: Numpy中的线性代数模块提供了多种线性代数运算函数,如矩阵乘法、求逆矩阵、求特征值、求行列式等。这些函数可以用来解决各种线性代数问题,如求解线性方程组、计算矩阵的秩等。 9. Numpy中的图像处理: Numpy中的图像处理模块提供了多种图像处理函数,如图像滤波、图像变换、图像分割等。这些函数可以用来对图像进行各种处理,如去噪、锐化、边缘检测等。 10. Numpy中的机器学习: Numpy中的机器学习模块提供了多种机器学习算法,如线性回归、逻辑回归、决策树、支持向量机、聚类等。这些算法可以用来解决各种机器学习问题,如分类、聚类、回归等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

秋冬晚归客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值