bg_w, bg_h, bg_ch, bg_rows = decode_png(bg_path)
bk_w, bk_h, bk_ch, bk_rows = decode_png(block_path)
if bg_ch != 3:
raise ValueError("background.png 需要是 RGB 图")
if bk_ch != 4:
raise ValueError("block.png 需要是 RGBA 图")
bg_gray = to_gray(bg_rows, bg_ch)
bk_gray = to_gray(bk_rows, bk_ch)
bk_mask = alpha_mask(bk_rows, bk_ch)
tpl_gray, tpl_mask = crop_by_mask(bk_gray, bk_mask)
bg_edges = edge_map(bg_gray)
tpl_edges = edge_map(tpl_gray)
x, y, score = find_best_position(bg_edges, tpl_edges, tpl_mask)
print(f"背景图尺寸: {bg_w}x{bg_h}")
print(f"滑块图尺寸: {bk_w}x{bk_h}")
print(f"缺口左上角坐标: (, {y})")
print(f"建议滑动距离(像素): ")
print(f"匹配误差(越小越好): {score:.2f}")
if __name__ == "__main__":
main()
核心原理
本质是:把滑块图当“模板”,在背景图里滑动对比,找到误差最小的位置。
参考实现都在
main.py
分步骤对应你看到的图片
step_01灰度化
把 RGB 转灰度,减少颜色维度干扰,只保留亮度结构。step_02Alpha 掩码
从block.png的透明通道提取有效像素(非透明=1,透明=0),只比较有意义区域。step_03背景边缘图
对背景灰度图做简易梯度(和左/上像素差分),突出轮廓。step_04模板边缘图
对裁剪后的滑块模板做同样边缘处理,保证比较口径一致。- 模板匹配(关键)
在背景每个候选(x,y)上,按掩码点计算 SSE 误差:
[
score(x,y)=\frac{1}{N}\sum (bg\_edgey+py-tpl\_edgepy)^2
]
取score最小的位置作为缺口位置。 step_05/step_06可视化step_05画匹配框;step_06把滑块半透明叠加到匹配位置,验证直观效果。
评论 (0)