首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用图像作为卷积核

用图像作为卷积核
EN

Stack Overflow用户
提问于 2018-10-28 21:19:04
回答 1查看 227关注 0票数 0

目前,我正在尝试实现谷歌发布的关于如何从图像中删除水印的本论文的一些结果。我用自己的水印创建了大约80张图片(字体和贯穿整个图片的线条),我能够用Laplacian过滤器检测边缘。

我的问题是,边缘不足以从图像中删除水印。当线条大于1像素时,边缘在两者之间留下一个空白。该文件规定如下:

特别地,对于给定的水印图像,我们得到一个冗长的边缘映射(使用Canny边缘检测器),并计算它的欧几里德距离变换,然后与水印边缘(水平和垂直翻转)进行卷积,得到每个像素到最近边缘的Chamfer距离。最后,将水印位置作为地图中距离最小的像素。

我可以使用以下代码获得距离转换:

代码语言:javascript
复制
### 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的编辑答案:

代码语言:javascript
复制
_, 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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-29 07:03:07

您给出的文件中的引号是“然后与水印边缘(水平和垂直翻转)合并”。

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

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

若要计算互相关,请使用Fourier域:

  1. 确保两幅图像(距离变换和水印边缘)大小相同。用零填充它们,使它们的大小相匹配。
  2. 计算两者的FFT。
  3. 计算水印图像的FFT的复共轭(这对应于在空间域中垂直和水平翻转图像)。
  4. 将两者相乘
  5. 计算逆变换,并裁剪出对应于添加到距离变换图像(如果有的话)的填充的区域。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53036180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档