【发布时间】:2018-10-30 06:37:32
【问题描述】:
我目前正在尝试实现由 Google 发布的关于如何从图像中删除水印的 this paper 的一些结果。我用自己的水印(整张图片上方的字体和交叉线)创建了大约 80 张图片,并且能够使用拉普拉斯滤波器检测边缘。
我的问题是边缘不足以从图像中去除水印。当线条宽于 1 个像素时,边缘会在它们之间留下间隙。论文是这样说的:
具体来说, 对于给定的水印图像,我们获得了一个详细的边缘图(使用 Canny 边缘检测器),并计算其欧几里得距离变换,然后与水印边缘(水平和垂直翻转)进行卷积,得到每个像素到边缘的倒角距离最近的边缘。最后取水印位置为地图中距离最小的像素。
我可以用下面的代码得到距离变换:
### Detect water mark edges
imgs = glob.glob("images/*.jpg")
mean = np.zeros((1200, 1600))
for i, filename in enumerate(imgs):
img = cv2.imread(filename,0)
mean += cv2.Laplacian(img,cv2.CV_64F,ksize=3)
mean /= len(imgs)
#### Edge map & distance transform
img = cv2.imread("images/1.jpg", 0)
can = cv2.Canny(img, 100, 200)
dist = cv2.distanceTransform(can, cv2.DIST_L2, 3)
但是我现在应该怎么做卷积呢?我的内核应该是什么?我的水印线条横跨整张图片,因此水印边缘图像与我的原始图像大小相同。
根据@Cris Luengo 回答编辑:
_, mean = cv2.threshold(mean, 64, 255, cv2.THRESH_BINARY)
meanFFT = np.fft.fft2(mean)
distFFT = np.fft.fft2(dist)
conj = np.conjugate(meanFFT)
res = distFFT * meanFFT
cv2.imwrite('watermark.png', np.fft.ifft(res).real)
【问题讨论】:
-
可能是水印的某种“模板”?
标签: python opencv computer-vision