如何用numpy在2D/3D矩阵中定位目标图像在背景图中的位置?
解决方法:用Numpy定位背景图中固定颜色方块的坐标
你的问题出在直接对两个可能尺寸不同的数组做相等判断,且没有针对「仅方块边缘颜色固定」的条件做针对性处理。以下是可行的实现方案:
核心思路
- 提取目标方块的固定边缘灰度值(利用方块颜色固定的特性,取其边缘像素值即可)
- 在背景灰度图中筛选出所有匹配该固定灰度值的像素坐标
- 从匹配坐标中提取方块的特征点(比如左上角)坐标
代码实现
import numpy as np import cv2 # 读取灰度图 background = cv2.imread('backgroundimage.png', cv2.IMREAD_GRAYSCALE) target = cv2.imread('target.png', cv2.IMREAD_GRAYSCALE) # 1. 获取目标方块的固定边缘灰度值(这里取目标图左上角像素作为固定颜色参考) fixed_color = target[0, 0] # 2. 在背景图中找到所有等于固定颜色的像素坐标 y_coords, x_coords = np.where(background == fixed_color) # 3. 计算方块左上角坐标(取最小的x、y值即为左上角点) if len(x_coords) > 0 and len(y_coords) > 0: top_left_x = np.min(x_coords) top_left_y = np.min(y_coords) print(f"目标方块左上角坐标:({top_left_y}, {top_left_x})") else: print("未找到目标方块")
进阶补充(针对空心方块)
如果目标是空心方块,仅边缘颜色固定,用轮廓检测定位会更精准:
# 用轮廓检测定位空心方块 ret, thresh = cv2.threshold(background, fixed_color-1, fixed_color+1, cv2.THRESH_BINARY) contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for cnt in contours: x, y, w, h = cv2.boundingRect(cnt) # 可根据方块预期宽高筛选目标 if w > 10 and h > 10: print(f"目标方块左上角坐标:({y}, {x})") break
内容的提问来源于stack exchange,提问作者kerz
相关产品推荐
相关产品推荐

