如何在不缩放的情况下用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
相关产品推荐
相关产品推荐

