目前,我正在尝试实现谷歌发布的关于如何从图像中删除水印的本论文的一些结果。我用自己的水印创建了大约80张图片(字体和贯穿整个图片的线条),我能够用Laplacian过滤器检测边缘。
我的问题是,边缘不足以从图像中删除水印。当线条大于1像素时,边缘在两者之间留下一个空白。该文件规定如下:
特别地,对于给定的水印图像,我们得到一个冗长的边缘映射(使用Canny边缘检测器),并计算它的欧几里德距离变换,然后与水印边缘(水平和垂直翻转)进行卷积,得到每个像素到最近边缘的Chamfer距离。最后,将水印位置作为地图中距离最小的像素。
我可以使用以下代码获得距离转换:
### 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)发布于 2018-10-29 07:03:07
您给出的文件中的引号是“然后与水印边缘(水平和垂直翻转)合并”。
具有水平和垂直翻转图像的卷积是与该图像的互相关联。因此,我们在这里计算了图像中边缘与水印边缘之间距离变换的互相关。互相关最小的移位是水印边缘与图像边缘最匹配的移位。
水印边缘是用Canny获得的,就像你得到图像的边缘一样。
若要计算互相关,请使用Fourier域:
https://stackoverflow.com/questions/53036180
复制相似问题