【问题标题】:Use image as convolution kernel使用图像作为卷积核
【发布时间】: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


【解决方案1】:

您给出的论文中的引语是“然后与水印边缘卷积(水平和垂直翻转)”。

图像水平和垂直翻转的卷积是与该图像的互相关。因此,这里我们正在计算图像边缘的距离变换与水印边缘的互相关。互相关最小的偏移是水印边缘与图像边缘最匹配的偏移。

水印边缘是使用 Canny 获得的,就像您获得图像的边缘一样。

要计算互相关,请使用傅里叶域:

  1. 确保两个图像(距离变换和水印边缘)大小相同。用零填充它们以使它们的大小匹配。

  2. 计算两者的 FFT。

  3. 计算水印图像的 FFT 的复共轭(这对应于在空间域中垂直和水平翻转图像)。

  4. 将两者相乘

  5. 计算逆变换,并裁剪掉与添加到距离变换图像(如果有)的填充相对应的区域。

【讨论】:

  • 感谢您的详细解答!我试图实现这一点,但这不会产生有用的图像。我将我的代码添加到上面的问题中。如果你能看看就好了。我的图像确实具有相同的大小。在第 4 步中,您是指矩阵乘法还是元素乘法?同样从逆变换中,您保留实部还是虚部?
  • @Cilenco:哦,您使用mean 作为您的模板?我想知道您为什么要计算...我认为该论文是基于您本身拥有水印图像的假设。您计算mean 的方式意味着水印在每张图像中的同一位置?那么试图定位它的意义何在?这种互相关过程旨在找出水印在图像中的位置。
  • 也就是说,conj = np.conjugate(meanFFT); res = distFFT * meanFFT 应该是 res = distFFT * np.conjugate(meanFFT)。您正在计算卷积,而不是互相关。我想是一个错字。结果应该是实值,检查虚部是否只是数值不准确(值1e-14左右),然后丢弃虚部,保留实部。
  • 谢谢,我会试试这个。 您计算的方式意味着水印在每张图像中的同一位置?那么尝试定位它的意义何在? 是的,没错,但我认为如果没有这一步,我只有水印的边缘 (mean),而不是整个水印本身。我稍后必须解决 alpha 问题,而边缘还不够,对吧?
  • @Cilenco:我点击了那里的链接,并快速浏览了这篇论文。他们似乎独立地使用 x 和 y 梯度的中值来确定水印是什么。我不明白为什么会这样,但我没有时间详细阅读这篇论文。请注意,您使用的是拉普拉斯的平均值,这两种操作都与论文中描述的不同。您应该尝试按照论文的内容进行操作,并且只有在您按预期工作时才会有所不同。否则你永远不知道哪里出了问题!
猜你喜欢
  • 2022-01-15
  • 1970-01-01
  • 2019-02-26
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 2019-07-19
  • 2019-06-14
相关资源
最近更新 更多