OpenCV:将彩色图像插入灰度图像时报错,求解决方法
问题原因及解决办法
错误根源
你遇到的报错核心是数据维度不匹配:
- 灰度图像
img_gray是单通道数组,形状为(高度, 宽度),每个像素仅存储一个灰度值(单个数字)。 - 彩色的
face是三通道数组,形状为(高度, 宽度, 3),每个像素是包含RGB三个值的序列。
直接把三通道的像素序列赋值给单通道的像素位置,就会触发ValueError: setting an array element with a sequence错误——单通道位置只能接收单个数值,无法容纳三个值的序列。
两种解决方案
方案1:将彩色脸转灰度后插入
和你第一个成功的例子逻辑一致,先把彩色的face转为灰度,再赋值到灰度背景图上:
import cv2 as cv import matplotlib.pyplot as plt img_gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY) # 先把彩色face转成灰度 face_grey = cv.cvtColor(face, cv.COLOR_RGB2GRAY) for row in range(face_grey.shape[0]): for column in range(face_grey.shape[1]): img_gray[row + 275][column + 340] = face_grey[row][column] # 显示灰度图要指定cmap='gray',否则颜色显示异常 plt.imshow(img_gray, cmap='gray') plt.show()
方案2:把灰度背景转成三通道,保留彩色脸的颜色
如果想保留face的彩色,需要先把单通道的灰度背景图转换成三通道的RGB格式(三个通道值相同,视觉上还是灰度),再插入彩色脸:
import cv2 as cv import matplotlib.pyplot as plt img_gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY) # 将单通道灰度图转为三通道RGB格式 img_gray_rgb = cv.cvtColor(img_gray, cv.COLOR_GRAY2RGB) for row in range(face.shape[0]): for column in range(face.shape[1]): img_gray_rgb[row + 275][column + 340] = face[row][column] plt.imshow(img_gray_rgb) plt.show()
优化建议:用切片替代嵌套循环
嵌套循环效率较低,OpenCV支持直接用数组切片赋值,代码更简洁且速度更快:
- 方案1的切片版本:
img_gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY) face_grey = cv.cvtColor(face, cv.COLOR_RGB2GRAY) # 计算插入区域的坐标 y_start, y_end = 275, 275 + face_grey.shape[0] x_start, x_end = 340, 340 + face_grey.shape[1] # 直接切片赋值 img_gray[y_start:y_end, x_start:x_end] = face_grey plt.imshow(img_gray, cmap='gray') plt.show()
- 方案2的切片版本:
img_gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY) img_gray_rgb = cv.cvtColor(img_gray, cv.COLOR_GRAY2RGB) y_start, y_end = 275, 275 + face.shape[0] x_start, x_end = 340, 340 + face.shape[1] img_gray_rgb[y_start:y_end, x_start:x_end] = face plt.imshow(img_gray_rgb) plt.show()
内容的提问来源于stack exchange,提问作者Python_Newbie
相关产品推荐
相关产品推荐

