如何用Python将黑白棋盘格转为指定双色棋盘格?
如何将黑白棋盘格转换为蓝黄双色棋盘格?
你已经成功生成了16x16的黑白棋盘格:
import numpy as np import cv2 checkers = np.tile(np.array([[0, 1], [1, 0]]), (16 // 2, 16 // 2))
下面分析你遇到的错误,并给出可行解决方案:
错误原因解析
1. Lambda函数的问题
当你把整个numpy数组传给lambda时,if x会尝试判断整个数组的布尔值——numpy不允许直接对多元素数组做真假判断,因为无法确定是用any()还是all(),因此抛出ValueError。即便用np.vectorize包装lambda,这种逐元素处理的效率也远低于numpy的向量化操作,不推荐使用。
2. np.where的维度不匹配问题
原checkers是(16,16)的二维单通道数组,而你传入的颜色是(3,)的一维数组,两者维度不兼容,无法进行广播运算,因此报错。需要先将单通道数组扩展为3通道,让每个像素位置对应3个颜色通道的值。
解决方案
方法一:扩展维度后使用np.where
先将单通道数组转为3通道,再用np.where替换颜色(注意OpenCV使用BGR颜色格式,蓝色为[255,0,0],黄色为[0,255,255]):
import numpy as np import cv2 # 生成16x16黑白棋盘格 checkers = np.tile(np.array([[0, 1], [1, 0]]), (8, 8)) # 将单通道数组扩展为3通道:(16,16) → (16,16,3) checkers_3d = np.expand_dims(checkers, axis=-1) # 替换颜色:0对应蓝色,1对应黄色 blue_yellow_checkers = np.where(checkers_3d == 0, [255, 0, 0], [0, 255, 255]) # 转换为OpenCV要求的uint8类型 blue_yellow_checkers = blue_yellow_checkers.astype(np.uint8) # 显示结果 cv2.imshow('Blue-Yellow Checkerboard', blue_yellow_checkers) cv2.waitKey(0) cv2.destroyAllWindows()
方法二:直接构建3通道颜色块并平铺
更直接的方式是先定义3通道的颜色基础块,再平铺生成棋盘格:
import numpy as np import cv2 # 定义BGR格式的蓝、黄两色 blue = np.array([255, 0, 0], dtype=np.uint8) yellow = np.array([0, 255, 255], dtype=np.uint8) # 创建2x2的颜色基础块 color_block = np.array([[blue, yellow], [yellow, blue]]) # 平铺8次得到16x16的棋盘格 blue_yellow_checkers = np.tile(color_block, (8, 8)) # 显示结果 cv2.imshow('Blue-Yellow Checkerboard', blue_yellow_checkers) cv2.waitKey(0) cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者simone
相关产品推荐
相关产品推荐

