You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 10:53:31