在OpenCV中,如果你使用 np.ones()
创建了一个灰度图像(二维数组),并使用 cv2.circle()
函数绘制一个圆,而没有指定 dtype
,NumPy 默认会创建一个浮点类型的数组,其值的范围是 1.0 到 1.0。当你在这样的数组上绘制时,任何非零的值都会被OpenCV解释为白色(或最亮的颜色)。
然而,你使用的是颜色 (0, 0, 255)
,这在RGB图像中代表蓝色。但是,由于 magic_board
是一个灰度图像(二维数组),OpenCV会将这个颜色映射到灰度值上。在这种情况下,颜色的每个分量 (0, 0, 255)
会被分别映射到一个灰度值上。由于灰度图像只有一个颜色通道,它将使用这三个分量中的最小值作为灰度值,这就是0。
这里是你代码中相关部分的解释:
magic_board = np.ones((200, 200)) # 创建一个灰度图像,所有值为1.0
cv2.circle(magic_board, (22, 22), 11, (0, 0, 255), -1) # 在图像上绘制一个圆
np.ones((200, 200))
创建了一个200x200像素的灰度图像,其中所有像素的灰度值为1.0。cv2.circle()
函数在图像上绘制一个圆。由于magic_board
是一个灰度图像,颜色(0, 0, 255)
中的每个分量(0, 0, 255)
被映射到一个灰度值上。由于使用了-1
作为半径参数,这表示填充整个圆,而圆的颜色由(0, 0, 255)
决定。在灰度图像中,颜色分量(0, 0, 255)
将被映射为0(红色分量为0,绿色通道也为0,蓝色分量为255,但因为是灰度图,所以只取最小的颜色分量值作为灰度值)。
因此,如果你看到的是一个黑色的实心圆,这实际上是因为灰度值被设置为0,而0在灰度图像中代表黑色。
要修正这个问题,确保 magic_board
是 uint8 类型,并且如果你想要一个蓝色的圆,你需要使用一个包含三个通道的彩色图像。这里是如何修改代码:
import cv2
import numpy as np
# 创建一个200x200的彩色图像,初始为灰色
magic_board = np.ones((200, 200, 3), dtype=np.uint8) * 255
# 在彩色图像上绘制一个蓝色的圆
cv2.circle(magic_board, (22, 22), 11, (0, 0, 255), -1)
cv2.imshow("img", magic_board)
cv2.waitKey(0)
cv2.destroyAllWindows()
在这个修改后的代码中,magic_board
是一个形状为 (200, 200, 3)
的彩色图像,每个像素由三个颜色通道的值组成,并且所有像素初始为白色(255, 255, 255)。使用 np.uint8
类型确保了颜色值的正确解释,并且绘制的圆将是蓝色的。