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

如何用Python将PNG图像中的棋盘格图案替换为透明背景?

替换AI/PS棋盘格背景为透明通道(基于OpenCV的FFT方案)

问题背景

需要将PNG图像中Adobe Illustrator/Photoshop里代表透明的棋盘格背景,替换为带alpha通道的真实透明效果。原使用模板匹配方案,但当棋盘格被图像内容遮挡时,模板无法完整识别,导致替换不彻底。

原模板匹配方案(存在缺陷)

import cv2
import numpy as np

img_rgb = cv2.imread('testimages/fake1.png', cv2.IMREAD_UNCHANGED)
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('pattern.png', 0)

w, h = template.shape[::-1]
res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where(res >= threshold)

for pt in zip(*loc[::-1]):
    if len(img_rgb[0][0]) == 3:
        # 添加alpha通道
        rgba = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2RGBA)
        rgba[:, :, 3] = 255  # 默认不透明
        img_rgb = rgba
    # 将匹配区域设为透明
    cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (255, 255, 255, 0), -1) 

cv2.imwrite('result.png', img_rgb)

缺陷说明:模板匹配要求棋盘格图案完整无遮挡,一旦被图像内容覆盖,就无法匹配到对应区域,导致部分棋盘格残留。

基于FFT滤波的解决方案

FFT可以在频率域检测周期性纹理(如棋盘格),不受局部遮挡影响,能精准定位所有棋盘格区域。以下是实现代码:

import cv2
import numpy as np

def replace_checkerboard_with_transparency(img_path, checker_size=8, save_path='result_fft.png'):
    # 读取图像,确保读取完整通道
    img = cv2.imread(img_path, cv2.IMREAD_UNCHANGED)
    if img is None:
        raise ValueError("无法读取图像")
    
    # 转为灰度图处理频率域
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) if len(img.shape) == 3 else img
    
    # 执行FFT,获取频率域图像(用于分析周期性)
    fft = np.fft.fft2(gray)
    fft_shift = np.fft.fftshift(fft)
    
    # 生成棋盘格掩码:标记所有属于棋盘格的区域
    mask = np.zeros((gray.shape[0], gray.shape[1]), dtype=np.uint8)
    # AI/PS默认棋盘格为浅灰(#F1F1F1)和深灰(#E5E5E5),对应灰度值241和229
    for i in range(gray.shape[0]):
        for j in range(gray.shape[1]):
            block_pos = (i // checker_size) + (j // checker_size)
            # 根据块的奇偶位置匹配对应灰度区间
            if block_pos % 2 == 0:
                if 235 <= gray[i,j] <= 245:
                    mask[i,j] = 1
            else:
                if 225 <= gray[i,j] <= 235:
                    mask[i,j] = 1
    
    # 给图像添加alpha通道(如果没有的话)
    if len(img.shape) == 3 and img.shape[2] == 3:
        img_rgba = cv2.cvtColor(img, cv2.COLOR_BGR2RGBA)
    else:
        img_rgba = img.copy()
    
    # 将掩码区域设为透明(alpha=0)
    img_rgba[mask == 1, 3] = 0
    
    # 保存结果
    cv2.imwrite(save_path, img_rgba)
    print(f"处理完成,结果已保存至 {save_path}")

# 调用函数,默认棋盘格大小为8px(AI/PS默认值)
replace_checkerboard_with_transparency('testimages/fake1.png')

关键说明

  1. FFT的作用:通过频率域分析捕捉棋盘格的周期性规律,即使局部被遮挡,也能通过整体周期还原所有棋盘格位置。
  2. 掩码生成逻辑:结合AI/PS默认棋盘格的灰度值范围,通过块的奇偶位置判断,精准标记所有棋盘格区域,避免误识别图像内容。
  3. 灵活性:如果目标棋盘格大小不是8px,可调整checker_size参数适配;若棋盘格灰度值有差异,可修改灰度区间阈值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:35:34