Sye*_*aan 12 python opencv watermark image-processing color-space
我想从事一个小项目来挑战我的计算机视觉和图像处理技能。我遇到了一个项目,我想从图像中删除隐藏的标记。隐藏在这里是指在 rgb 空间中不容易看到的水印,但是当您转换为 hsv 或其他空间时,这些标记变得可见。
下面是一个例子:
BGR空间:
HSV空间:
我尝试了不同的方法,但能够实现一个解决方案,从图像中删除这些水印。我在这里发布这个问题是为了获得解决这个问题的不同想法。
我尝试过的:
我尝试了各种方法,但都没有奏效,共享代码可能无济于事。没有必要为其提供代码,伪代码、想法或任何线索将不胜感激。
代码:
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)
问题:这并不能解决问题,它确实使颜色变暗了,但图像颜色也受到了干扰。
我试着玩弄 B 频道,看看是否能完成一些事情。
我还注意到,如果我们将图像转换为 LUV 空间,那么标记在 V 空间中是可见的。
这可能是一种可能的方法。基本思想是 HSV 通道中存在原始图像中不存在的可见边缘。以下是并排的 H、S 和 V 通道:
因此,如果我们找到原始图像中的边缘和 HSV 图像中的边缘并对它们进行差异,水印就应该显示出来。然后可以将其用作掩模,通过OpenCV inpaint在原始图像中进行修复。
我只是在终端中使用ImageMagick ,但也可以使用OpenCV、PIL或scikit-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中的遮罩进行修复 - 请参阅上面的链接。
我没有找到任何可以完全解决问题的答案。我很感谢大家的努力(谢谢)。我自己做了一些事情并想分享。它导致质量损失很小(有点蓝色模糊),但成功去除了水印。解决方案非常简单,但需要时间来分析图像。
如果有人可以扩展这种方法并提出更好的方法,我将非常高兴
我观察到水印仅在 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)