在NumPy中复制随机矩形区域至另一图像时遇广播错误求助
解决数组形状不匹配的赋值错误
这个问题我太熟了!你遇到的ValueError本质是从DNR图里截出来的patch和要放到RCV里的区域尺寸不一样——错误提示里的(425,91,3)是DNR patch的形状,(959,91,3)是RCV上目标区域的形状,高度差了一倍多,自然没法把小patch塞进大区域里。
问题出在哪?
你原来的代码逻辑是分别在两张图里随机选起始和结束坐标,相当于给RCV选了一块区域,又给DNR选了另一块完全没关系的区域,两者的高度/宽度大概率不一致,这就导致了形状不匹配。
正确的做法:先定尺寸,再选位置
核心思路是先统一确定要截取的矩形尺寸,再分别在两张图里选能放下这个尺寸的起始位置,这样两张图的patch形状绝对一致:
import cv2 import random import matplotlib.pyplot as plt # 你的图片路径 rcv = "path/to/image/RCV.JPG" dnr_1 = "path/to/image/DNR.JPG" # 读取图片(注意cv2读的是BGR格式) I_rcv = cv2.imread(rcv) I_dnr = cv2.imread(dnr_1) # 第一步:固定要截取的矩形尺寸,范围在[128, 1024]之间 min_size = 128 max_size = 1024 patch_height = random.randint(min_size, max_size) patch_width = random.randint(min_size, max_size) # 第二步:计算两张图中能容纳该尺寸的起始坐标上限 # 高度方向(y轴):起始坐标不能超过 图片高度 - patch高度 max_y_dnr = I_dnr.shape[0] - patch_height max_y_rcv = I_rcv.shape[0] - patch_height # 宽度方向(x轴):起始坐标不能超过 图片宽度 - patch宽度 max_x_dnr = I_dnr.shape[1] - patch_width max_x_rcv = I_rcv.shape[1] - patch_width # 第三步:分别在两张图里随机选起始坐标 start_y_dnr = random.randint(0, max_y_dnr) start_x_dnr = random.randint(0, max_x_dnr) start_y_rcv = random.randint(0, max_y_rcv) start_x_rcv = random.randint(0, max_x_rcv) # 第四步:截取patch并赋值 dnr_patch = I_dnr[start_y_dnr:start_y_dnr+patch_height, start_x_dnr:start_x_dnr+patch_width] I_rcv[start_y_rcv:start_y_rcv+patch_height, start_x_rcv:start_x_rcv+patch_width] = dnr_patch # 转成RGB再显示(避免cv2的BGR格式导致颜色偏色) plt.imshow(cv2.cvtColor(I_rcv, cv2.COLOR_BGR2RGB)) plt.show()
额外注意点
- 如果你的两张图中有任意一张的宽/高小于128,代码会报错(因为
random.randint(0, 负数)不合法),可以加个前置判断:# 检查图片尺寸是否满足最小要求 if I_dnr.shape[0] < min_size or I_dnr.shape[1] < min_size or \ I_rcv.shape[0] < min_size or I_rcv.shape[1] < min_size: print("图片尺寸太小,无法截取指定范围的矩形!") exit() - cv2默认读取的是BGR通道,直接用
plt.imshow会显示偏色,所以一定要转成RGB格式。
内容的提问来源于stack exchange,提问作者Manish Yadav
相关产品推荐
相关产品推荐

