从图像中删除透明的水印-Python

问题描述 投票:0回答:1

我想从图像中删除文本“水印”。如您所见,文本是透明的。因此,我想将该文本替换为原始背景。 像这样的东西是我所需的输出:

我尝试了一些示例(我目前正在使用CV2,如果其他库可以解决问题,请也建议),但是没有一个库,但没有一个库。我知道要走的方法是戴上口罩(例如在

帖中),但是它们都已经有蒙版的图像,但是我没有。 我试图做的是要戴上口罩的地方,我拒绝了黑白的饱和度,并创建了图像“ imagemask.jpg”,然后尝试以

for

循环的方式浏览像素:

mask = cv2.imread('imagemask.jpg') new = [] rows, cols, _ = mask.shape for i in range(rows): new.append([]) #print(i) for j in range(cols): k = img[i, j] #print(k) if all(x in range(110, 130) for x in k): new[-1].append((255, 255, 255)) else: new[-1].append((0, 0, 0)) cv2.imwrite('finalmask.jpg', np.array(new)) 之后,然后想将代码用于蒙版,但是我意识到“ finalmask.jpg”是一个完整的混乱...所以我没有尝试使用掩码的代码。 这实际上是可能的吗?我已经尝试了大约3个小时,但没有运气...

我的朋友,这并不小。为了增加受伤的侮辱,您的形象非常低分辨率,压缩并具有令人讨厌的眩光 - 这根本无济于事。请查看您的输入并相应地设置您的期望。话虽如此,让我们尝试通过拥有的东西来获得最佳结果。这些是我提出的步骤:

tory到

细分

图像中的watermark
文本

filter
分割面膜,并尝试使二进制面膜尽可能清洁
使用输入映像作为参考,将文本掩码用于

in-paint

现在,正如您已经看到的那样,棘手的部分正在细分文本。在尝试了一些技术和颜色空间后,我发现
python image opencv transparency watermark
1个回答
8
投票
CMYK

颜色空间 - 尤其是

KChannel
    -提供了有希望的结果。文本很清楚,我们可以对此进行尝试,让我们看一下:
  1. Adaptive Thresholding # Imports import cv2 import numpy as np # Read image imagePath = "D://opencvImages//" img = cv2.imread(imagePath+"0f5zZm.jpg") # Store a deep copy for the inpaint operation: originalImg = img.copy() # Convert to float and divide by 255: imgFloat = img.astype(np.float) / 255. # Calculate channel K: kChannel = 1 - np.max(imgFloat, axis=2)
  2. 不直接提供
  3. OpenCV转换,因此我必须手动使用contryversion公式来获取
  4. BGR
  5. 通道。这很简单。 CMYK(或
  6. Key
)通道代表最低强度(黑色)的像素,颜色为白色。这意味着几乎是白色的文本将以黑色渲染...这是输入的

K频道:


您看到输入上较深的像素几乎是白色的?太好了,似乎在文本和其他所有内容之间得到了明显的分离。可惜的是,我们在右侧有一些令人讨厌的眩光。无论如何,转换涉及K操作,因此要小心
K
。也许我们可以通过稍微亮度/对比度调整来改善此图像。只是一点点,我只是想将更多的文字与讨厌的眩光分开:

float

这是调整后的图像:


似乎在文字和眩光之间有更多的分离。好吧,让我们对这个坏男孩应用一个初始分割面膜:
data types
您看到我在这里使用不那么远的
# Apply a contrast/brightness adjustment on Channel K:
alpha = 0
beta = 1.2
adjustedK = cv2.normalize(kChannel, None, alpha, beta, cv2.NORM_MINMAX, cv2.CV_32F)

# Convert back to uint 8:
adjustedK = (255*adjustedK).astype(np.uint8)
在这里阈值吗?如果愿意,请随意调整这些参数。这是我得到的二进制图像:
Yeah,有很多噪音。这是我建议获得更清洁的面膜的建议:比文本有一些明显的斑点。同样,除文本外,还有其他斑点。让我们找到大斑点和小斑点,并提取它们。如果我们正确设置参数,则结果图像应包含文本。让我们看看:
Adaptive Thresholding
在这里,我正在使用称为
# Adaptive Thresholding on adjusted Channel K: windowSize = 21 windowConstant = 11 binaryImg = cv2.adaptiveThreshold(adjustedK, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, windowSize, windowConstant)

的辅助功能。此功能返回图像的所有斑点,该斑点高于最小面积阈值。我将在答案结束时发布功能。同时,请查看这些酷图像: big blobs:

滤光了小斑点:

它们之间的区别:

,似乎某些角色没有在过滤操作中幸存下来。这是因为眩光和文本的交集太多,无法获得清晰的分离。可能会受益于镶嵌结果的东西是在这个面具上的微妙模糊,以摆脱这种压缩别名。让我们涂抹一些
windowSize

以使面膜平滑一点:

# Get the biggest blobs on the image: minArea = 180 bigBlobs = areaFilter(minArea, binaryImg) # Filter the smallest blobs on the image: minArea = 20 smallBlobs = areaFilter(minArea, binaryImg) # Let's try to isolate the text: textMask = smallBlobs - bigBlobs cv2.imshow("Text Mask", textMask) cv2.waitKey(0)

内核并不大,我只想要微妙的效果。这是结果:

最终,让我们使用镶嵌:

areaFilter

这是最终结果:

考虑输入图像,well并不是那么糟糕。您可以尝试进一步改善结果来调整一些价值,但是我的伙计,这一生的现实是,输入图像一开始并不好。这是

Gaussian Blur函数: # Blur the mask a little bit to get a # smoother inpanting result: kernelSize = (3, 3) textMask = cv2.GaussianBlur(textMask, kernelSize, cv2.BORDER_DEFAULT)

这不在我的图像上。水印未正确卸下,并且在某个时候也模糊了图像。
	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.