我试图用Python脚本删除一些PNG中带有透明颜色(alpha通道)的方格背景(在Adobe Illustrator和Photoshop中表示透明背景)。
首先,我使用 * 模板匹配 *:
import cv2
import numpy as np
from matplotlib import pyplot as plt
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:
# add alpha channel
rgba = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2RGBA)
rgba[:, :, 3] = 255 # default not transparent
img_rgb = rgba
# replace the area with a transparent rectangle
cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (255, 255, 255, 0), -1)
cv2.imwrite('result.png', img_rgb)
源图像:fake1.png文件
模式模板:模式.png
输出:result.png(灰色区域实际上是透明的;放大一点以便查看)
我知道这种方法有问题,因为在某些情况下,模板无法完全识别,因为部分图案被PNG图像中的图形隐藏。
**我的问题是:**如何通过FFT滤波使用OpenCV?完美匹配这样的模式?
参考文献:
- How particular pixel to transparent in opencv python?
- Detecting a pattern in an image and retrieving its position
- https://python.plainenglish.io/how-to-remove-image-background-using-python-6f7ffa8eab15
- https://answers.opencv.org/question/232506/make-the-background-of-the-image-transparent-using-a-mask/
- https://dsp.stackexchange.com/questions/36679/which-image-filter-can-be-applied-to-remove-gridded-pattern-from-corrupt-jpegs
3条答案
按热度按时间bogh5gae1#
这里有一种在Python/OpenCV中实现这一点的方法,只需对校验颜色范围设置阈值。
输入:
下载生成的图像,看看它实际上是透明的。
fdbelqdn2#
这里 有 一 种 在 Python/OpenCV/Numpy 中 使用 DFT 来 处理 图像 的 方法 。 我们 需要 知道 棋盘 图案 的 大小 ( 亮 或 暗 的 正方 形 大小 ) 。
输入 :
中 的 每 一 个
棋盘 图像 :
光谱 棋盘 格 :
遮罩 :
语言
结果 ( 陷 波 滤波 图像 ) :
指令 集
结果 中 的 棋盘 格 图案 从 原始 图案 中 减轻 , 但 在 仔细 检查 后 仍 存在 。
从 这里 开始 , 我们 需要 在 白色 背景 上 设置 阈值 , 并 反转 以 生成 alpha 通道 的 图像 。 然后 将 图像 转换 为 4 BGRA , 并 将 alpha 通道 插入 到 BGRA 图像 中 , 正如 我 在 下面 的 另 一 个 答案 中 所 描述 的 。
yb3bgrhw3#
既然你正在处理的是透明背景的PNG,那么你可以尝试提取没有方格的部分,而不是试图检测方格背景。这可以通过对所有像素进行颜色检查来实现。你可以使用opencv的
inRange()
函数。我将在下面链接一个StackOverflow链接,它试图检测图像上的暗点。Inrange example