OpenCV 读取和修改图像像素值

「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战

OpenCV 在不同颜色空间中访问和操作像素

本节将介绍如何使用 OpenCV 访问和读取像素值以及如何修改它们。此外,还将学习如何访问图像属性。如果想一次处理多个像素,则需要创建图像区域 (Region of Image, ROI)。 在 Python 中,图像表示为 NumPy 数组。因此,示例中包含的大多数操作都与 NumPy 相关,建议对 NumPy 包有一些了解,才能更好明白示例代码的原理,但即使不了解也没关系,必要时会对所用函数进行讲解。

彩色图像访问和操作OpenCV中的像素

现在,我们来看看如何在 OpenCV 中处理BGR图像。如上所述,OpenCV 加载彩色图像时,蓝色通道是第一个,绿色通道是第二个,红色通道是第三个。 首先,使用 cv2.imread() 函数读取图像。图像应该在工作目录中,或者应该提供图片的完整路径。在本例中,读取 sigonghuiye.jpeg 图像并将其存储在img变量中:

img = cv2.imread('sigonghuiye.jpeg')
复制代码

图像加载到 img 后,可以获得图像的一些属性。我们要从加载的图像中提取的第一个属性是 shape,它将告诉我们行、列和通道的数量(如果图像是彩色的)。我们将此信息存储在 dimensions 变量中:

dimensions = img.shape
复制代码

第二个属性是图像的大小(img.size=图像高度 × 图像宽度 × 图像通道数):

total_number_of_elements= img.size
复制代码

第三个属性是图像数据类型,可以通过 img.dtype 获得。因为像素值在 [0-255] 范围内,所以图像数据类型是 uint8 (unsigned char):

image_dtype = img.dtype
复制代码

上面示例中,我们已经使用了 cv2.imshow() 函数来在窗口中显示图像,这里我们对其进行更详细的介绍,使用 cv2.imshow() 函数显示图像时,窗口会自动适应图像大小。此函数的第一个参数是窗口名,第二个参数是要显示的图像。在这种情况下,由于加载的图像已存储在 img 变量中,因此使用此变量作为第二个参数:

cv2.imshow("original image", img)
复制代码

显示图像后,我们来介绍下键盘绑定函数——cv2.waitKey(),它为任何键盘事件等待指定的毫秒数。参数是以毫秒为单位的时间。当执行到此函数时,程序将暂停执行,当按下任何键后,程序将继续执行。如果毫秒数为 0 (cv2.waitKey(0)),它将无限期地等待键盘敲击事件:

cv2.waitKey(0)
复制代码

要访问(读取)某个像素值,我们需要向 img 变量(包含加载的图像)提供所需像素的行和列,例如,要获得 ( x = 40 , y = 6 ) (x=40, y=6) 处的像素值 :

(b, g, r) = img[6, 40]
复制代码

我们在三个变量 (b, g, r) 中存储了三个像素值。请牢记 OpenCV 对彩色图像使用 BGR 格式。另外,我们可以一次仅访问一个通道。在本例中,我们将使用所需通道的行、列和索引进行索引。例如,要仅获取像素 ( x = 40 , y = 6 ) (x=40, y=6) 处的蓝色值:

b = img[6, 40, 0]
复制代码

像素值也可以以相同的方式进行修改。例如,要将像素 (x=40, y=6) 处设置为红色:

img[6, 40] = (0, 0, 255)
复制代码

有时,需要处理某个区域而不是一个像素。在这种情况下,应该提供值的范围(也称切片),而不是单个值。例如,要获取图像的左上角:

top_left_corner = img[0:50, 0:50]
复制代码

变量 top_left_corner 可以看做是另一个图像(比img小),但是我们可以用同样的方法处理它。 最后,如果想要关闭并释放所有窗口,需要使用 cv2.destroyAllWindows() 函数:

cv2.destroyAllWindows()
复制代码

灰度图像访问和操作OpenCV中的像素

灰度图像只有一个通道。因此,在处理这些图像时会引入一些差异。我们将在这里重点介绍这些差异,相同的部分不再赘述。 同样,我们将使用 cv2.imread() 函数来读取图像。在这种情况下,需要第二个参数,因为我们希望以灰度加载图像。第二个参数是一个标志位,指定读取图像的方式。以灰度加载图像所需的值是 cv2.IMREAD_grayscale:

gray_img = cv2.imread('logo.png', cv2.IMREAD_GRAYSCALE)
复制代码

在这种情况下,我们将图像存储在gray_img变量中。如果我们打印图像的尺寸(使用 gray_img.shape ),只能得到两个值,即行和列。在灰度图像中,不提供通道信息:

dimensions = gray_img.shape
复制代码

shape将以元组形式返回图像的维度 —— (828, 640)。 像素值可以通过行和列坐标来访问。在灰度图像中,只获得一个值(通常称为像素的强度)。例如,如果我们想得到像素 ( x = 40 , y = 6 ) (x=40, y=6) 处的像素强度:

i = gray_img[6, 40]
复制代码

图像的像素值也可以以相同的方式修改。例如,如果要将像素 ( x = 40 , y = 6 ) (x=40, y=6) 处的值更改为黑色(强度等于0):

gray_img[6, 40] = 0
复制代码

相关链接

OpenCV图像处理基础

OpenCV中的坐标系与图像通道顺序

Guess you like

Origin juejin.im/post/7055104705998880805