OpenCV:如何只访问一个蓝色像素?

OpenCV: how to access a blue pixel only?

来自 documentation,我找到了这段代码示例:

import cv2
import numpy

img=cv2.imread('picture.jpg')  

# Accessing only blue pixel
blue=img[100,100,0]
print blue # it prints 157

谁能给我解释一下这一行:blue=img[100,100,0]?我不明白,因为要访问一个像素,我们只需要它的x和y坐标,所以我不明白这里的第三个坐标,它与蓝色像素有什么关系。

看起来 [100,100,0] 不是像素坐标而是 BGR 颜色坐标。

BGR 中的

[100, 100, 0] 转换为十六进制的 #006464,确实是蓝色的。

img[100,100,0] returns坐标为[100,100]

的像素点的蓝色通道值

要获得整个像素,我们只需要 运行 这个 img[100,100] 它会给出一个 BGR 列表,例如 [157, G, R]

示例:

import cv2
import numpy as np 
img=cv2.imread('photo.png')
px=img[300,300]
print px
blue=img[300,300,0]
print blue

输出:

[47 72 62 ]
47

47 是由坐标 (300,300)

定义的像素的蓝色通道强度

这个答案是 Antti Haapala

给我的

OpenCV 中的图像表示为 3D numpy ndarray。前两个轴(X 和 Y)表示像素矩阵。 第三个轴 (Z) 包含颜色通道 (B、G、R)。您在这一行中所做的是通过 x、y 和 z 坐标选择一个像素。 img[100,100,0] 中的第三个索引(0)是像素颜色值 [B,G,R] 数组中的第 0 个元素,因此是您的蓝色通道。 希望对您有所帮助。

如前所述,

img[100,100,0] returns the blue channel value of the pixel with coordinates [100,100]

前两个数字是像素位置的 [row, column] 值,第三个是颜色值。由于在这种情况下我们将颜色值设置为 0,因此我们正在访问蓝色值。如果我们要将最后一个值从 0 更改为 12,我们将分别访问绿色或红色值。

示例:

px = img[100,100] #we are accessing pixel location at [row,column]
print (px) 

#Accessing the blue, green and red intensity in the image
blue = img[100,100,0]
green = img[100,100,1]
red = img[100,100,2]

#printing intensity 
print (blue) 
print (green)
print (red)

输出:

[57 63 68]
57
63
68

希望对您有所帮助。

以上回答不够深入。如果你想了解为什么 img[100, 100, 0] return 是蓝色的,我们必须检查 img 对象本身。

img对象表示为一个ndarray。为了清楚起见,只需裁剪一个 5x5 像素的图像并检查它的实际情况。

>>>img.shape
(5, 5, 3)

>>>img
array([[[ 73, 121, 129],
    [ 67, 111, 122],
    [ 62,  97, 111],
    [ 72, 105, 121],
    [ 79, 115, 128]],

   [[ 72, 119, 134],
    [ 73, 119, 134],
    [ 70, 109, 124],
    [ 66, 104, 118],
    [ 63, 107, 118]],

   [[ 80, 125, 143],
    [ 66, 114, 132],
    [ 68, 111, 128],
    [ 63, 103, 117],
    [ 55,  99, 110]],

   [[104, 142, 164],
    [ 76, 122, 137],
    [ 77, 121, 138],
    [ 70, 109, 124],
    [ 57,  97, 109]],

   [[ 80, 117, 135],
    [ 66, 110, 124],
    [ 71, 114, 129],
    [ 86, 123, 137],
    [ 77, 115, 126]]], dtype=uint8)

>>> img[2, 2, 0]
68