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
更改为 1
或 2
,我们将分别访问绿色或红色值。
示例:
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
来自 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 颜色坐标。
[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
更改为 1
或 2
,我们将分别访问绿色或红色值。
示例:
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