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

如何在不缩放的情况下用cv.inpaint移除大图中的叠加小图?

解决方案:生成匹配原图尺寸的精准Mask进行Inpaint

问题出在你使用的mask和原图尺寸不匹配,且直接补黑会引入无效像素影响SSIM。正确的做法是根据小图在原图上的精确位置,生成和原图完全同尺寸的mask,标记出需要修复的区域,再执行inpaint。

具体步骤:

  • 确定小图在原图上的左上角坐标(x, y)以及小图的宽度w、高度h(可以通过图像标注工具或叠加小图时记录的坐标获取)。
  • 创建与原图尺寸一致的全黑灰度mask,在小图覆盖的区域填充白色(255),作为inpaint的修复标记。
  • 使用匹配尺寸的mask执行inpaint,修复区域由周围像素填充,不会引入黑像素,保证SSIM测试的精度。

适配Google Colab的代码示例:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

# 读取原图(大图)
img = cv.imread('messi_2.jpg')
# 转换为RGB格式适配Matplotlib显示
img_rgb = cv.cvtColor(img, cv.COLOR_BGR2RGB)

# --------------------------
# 关键:替换为你实际的小图位置参数
x, y = 100, 150  # 小图左上角坐标
w, h = 200, 180  # 小图的宽度和高度
# --------------------------

# 创建与原图同尺寸的全黑mask
mask = np.zeros(img.shape[:2], dtype=np.uint8)
# 在小图区域填充白色标记修复区域
mask[y:y+h, x:x+w] = 255

# 执行inpaint修复
dst = cv.inpaint(img, mask, 3, cv.INPAINT_TELEA)
dst_rgb = cv.cvtColor(dst, cv.COLOR_BGR2RGB)

# 在Colab中显示结果(替代cv.imshow)
plt.figure(figsize=(12, 6))
plt.subplot(131), plt.imshow(img_rgb), plt.title('原图')
plt.subplot(132), plt.imshow(mask, cmap='gray'), plt.title('Mask')
plt.subplot(133), plt.imshow(dst_rgb), plt.title('修复后')
plt.show()

自动定位小图位置的补充代码:

如果不知道小图的精确位置,可以通过模板匹配自动获取:

# 读取小图
small_img = cv.imread('small_overlay.jpg', cv.IMREAD_GRAYSCALE)
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 模板匹配定位小图
res = cv.matchTemplate(img_gray, small_img, cv.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
# 获取小图的坐标和尺寸
x, y = max_loc
w, h = small_img.shape[1], small_img.shape[0]

内容的提问来源于stack exchange,提问作者KratosGow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 03:17:46