本节中几乎所有的操作都主要与 Numpy 相关,而不是 OpenCV。需要对Numpy有很好的了解才能使用OpenCV编写更好的优化代码。
访问像素值并对其进行修改
加载图像,cv.imread
import numpy as np
import cv2 as cv
img = cv.imread('messi5.jpg')
您可以通过像素值的行坐标和列坐标来访问像素值。对于 BGR 图像,它返回蓝色、绿色、红色值的数组。对于灰度图像,仅返回相应的强度。
px = img[100,100]
print( px )
#[157 166 200]
# accessing only blue pixel
blue = img[100,100,0]
print( blue )
#157
您可以以相同的方式修改像素值
img[100,100] = [255,255,255]
print( img[100,100] )
#[255 255 255]
上述方法通常用于选择数组的区域,例如前 5 行和后 3 列。对于单个像素访问,Numpy 数组方法、array.item() 和 array.itemset() 被认为更好。但是,它们总是返回一个标量,因此如果要访问所有 B,G,R 值,则需要为每个值单独调用 array.item()。
更好的像素访问和编辑方法:
img.item(10,10,2)
#59
# modifying RED value
img.itemset((10,10,2),100)
img.item(10,10,2)
#100
访问图像属性
图像属性包括行数、列数和通道数;图像数据类型;像素数;等。
图像的形状由 (shape) 访问。它返回行数、列数和通道数的元组(如果图像是彩色的):
print( img.shape )
如果图像是灰度的,则返回的元组仅包含行数和列数,因此该方法是检查加载的图像是灰度还是彩色的好方法。
返回图片的像素块个数,(size)
print( img.size )
图像数据类型(dtype),在Python中,uint8类型是一个无符号8位整数类型,用于表示0到255之间的整数值。它是最常用的数据类型之一,可以在众多应用场景中使用,如图像处理、音频处理、机器学习等领域。Python中的uint8类型是基于NumPy库的并且支持向量化操作。因此,它允许我们在数组、矩阵等结构中快速地执行计算和操作。
print( img.dtype )
img.dtype 在调试时非常重要,因为 OpenCV-Python 代码中的大量错误是由无效数据类型引起的。
设置ROI(投资汇报率)
有时,您将不得不使用图像的某些区域。对于图像中的眼睛检测,首先对整个图像进行人脸检测。当获得人脸时,我们单独选择人脸区域并搜索其中的眼睛,而不是搜索整个图像。它提高了准确性(因为眼睛总是长在脸上)和性能(因为我们在小区域内搜索)。
ROI依然使用Numpy索引获得。在这里,我选择球并将其复制到图像中的另一个区域:
ball = img[280:340, 330:390]
img[273:333, 100:160] = ball
拆分和合并图像
有时您需要在图像的 B、G、R 通道上单独工作。这时,您需要将 BGR 图像拆分(split)为单个通道。在其他情况下,您可能需要加入(merge)这些单独的通道才能创建 BGR 映像。您可以通过以下方式简单地执行此操作:
b,g,r=cv.split(img)
cv.imshow("B", b)
cv.imshow("G", g)
cv.imshow("R", r)
img=cv.merge([b,g,r])
为图像制作边框(填充)
如果你想在图像周围创建一个边框,比如相框,你可以使用 cv.copyMakeBorder()。但它在卷积操作、零填充等方面有更多的应用。此函数采用以下参数:
- SRC - 输入图像
- top、bottom、left、right - 相应方向上像素数的边框宽度
- borderType - 定义要添加的边框类型的标志。它可以是以下类型:
- cv.BORDER_CONSTANT - 添加恒定的彩色边框。该值应作为下一个参数给出。
- cv.BORDER_REFLECT - 边框将是边框元素的镜像反射,如下所示:fedcba|abcdefgh|hgfedcb
- cv.BORDER_REFLECT_101或cv.BORDER_DEFAULT - 同上,但略有变化,如下所示:gfedcb|abcdefgh|gfedcba
- cv.BORDER_REPLICATE - 最后一个元素被复制到整个元素,如下所示:aaaaaa|abcdefgh|hhhhhhh
- cv.BORDER_WRAP - 无法解释,它看起来像这样:cdefgh|abcdefgh|abcdefg
- value - 边框类型为cv.BORDER_CONSTANT时边框的颜色