如何使用python opencv从图像中删除隐藏标记?

Sye*_*aan 12 python opencv watermark image-processing color-space

我想从事一个小项目来挑战我的计算机视觉和图像处理技能。我遇到了一个项目,我想从图像中删除隐藏的标记。隐藏在这里是指在 rgb 空间中不容易看到的水印,但是当您转换为 hsv 或其他空间时,这些标记变得可见。

下面是一个例子:

BGR空间:

在此处输入图片说明

HSV空间:

在此处输入图片说明

我尝试了不同的方法,但能够实现一个解决方案,从图像中删除这些水印。我在这里发布这个问题是为了获得解决这个问题的不同想法。

我尝试过的:

我尝试了各种方法,但都没有奏效,共享代码可能无济于事。没有必要为其提供代码,伪代码、想法或任何线索将不胜感激。

  1. 我注意到隐藏的标记都是类似于 RGB(90,94,105) 的颜色。当我分别显示 R、G 和 B 时,我注意到水印仅在 B 通道中可见。我想如果调整/去除B通道中的标记并再次合并图像,可能会得到更好的结果。

代码

b,g,r = cv2.split(img)
b = b//2;
r = cv2.merge((r,g,b))
cv2.imshow("image",r)
Run Code Online (Sandbox Code Playgroud)

问题:这并不能解决问题,它确实使颜色变暗了,但图像颜色也受到了干扰。

  1. 我试着玩弄 B 频道,看看是否能完成一些事情。

  2. 我还注意到,如果我们将图像转换为 LUV 空间,那么标记在 V 空间中是可见的。

Mar*_*ell 5

这可能是一种可能的方法。基本思想是 HSV 通道中存在原始图像中不存在的可见边缘。以下是并排的 H、S 和 V 通道:

在此输入图像描述

因此,如果我们找到原始图像中的边缘和 HSV 图像中的边缘并对它们进行差异,水印就应该显示出来。然后可以将其用作掩模,通过OpenCV inpaint在原始图像中进行修复。

我只是在终端中使用ImageMagick ,但也可以使用OpenCVPILscikit-image同样完成:

# Detect edges visible in original image and auto-level
convert watermarked.png -colorspace gray -auto-level -canny 0x1+1%+3% -auto-level  RGB-edges.png
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

# Find visible edges in H, S and V colourspace, generate mean across all three and auto-level
convert watermarked.png -colorspace hsv -separate -canny 0x1+1%+3% -evaluate-sequence mean -auto-level HSV-edges.png
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

# Find changemask between the two sets of edges
convert RGB-edges.png HSV-edges.png -compose changemask -composite result.png
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这个想法是水印现在被识别为黑色,因此使用黑色区域(可能形态上闭合)作为OpenCV中的遮罩进行修复 - 请参阅上面的链接。


Sye*_*aan 2

我没有找到任何可以完全解决问题的答案。我很感谢大家的努力(谢谢)。我自己做了一些事情并想分享。它导致质量损失很小(有点蓝色模糊),但成功去除了水印。解决方案非常简单,但需要时间来分析图像。

如果有人可以扩展这种方法并提出更好的方法,我将非常高兴

我观察到水印仅在 B 空间(RGB 之外)中可见,并且在 R 和 G 空间中没有水印痕迹。

B空间:

在此输入图像描述

我还在某处标红,与 R 和 G 通道相比,蓝光对整体图像的贡献很小,所以这就是我决定做的。

对 B 通道进行足够大的模糊处理,以消除这些图案的痕迹。以下是 B 通道随后出现的样子:

在此输入图像描述

最后,将图像与新的 B 通道、之前的 R 通道和之前的 G 通道合并。以下是 RGB 通道随后的显示方式:

在此输入图像描述

使用方法的优点是痕迹消失。

唯一的缺点是黑色边缘出现偏蓝和偏紫的颜色,图像总体上有点偏蓝。

我的代码:

import cv2
from matplotlib import pyplot as plt
import numpy as np
img = cv2.imread("img.png")
b, g, r = cv2.split(img) # split into B,G,R spaces 
b = cv2.GaussianBlur(b, None, 8)
plt.imshow(cv2.merge((r,g,b)), cmap='gray')
Run Code Online (Sandbox Code Playgroud)