使用python / opencv / deep learning从图像中删除徽标/水印给定的位置

时间:2019-04-23 12:20:41

标签: python opencv deep-learning watermark cv2

我对使用Python进行opencv和深度学习非常陌生。我正在尝试从图像中删除水印/徽标。我可以通过在图像的原始图像中找到裁剪的水印图像的位置来找到水印的位置,该位置对于所有图像都是恒定的。我需要删除找到的水印。

以下是原始图片:[![original_image.jpeg] [1]] [1] 原始图像2:[![en enter code here此处的图像描述] [2]] [2] 原始图片3:[![在此处输入图片描述] [3]] [3]

从原始图像中裁剪出水印图像:[![cropped_image.jpeg] [4]] [4]

图像中找到的水印: [![定位水印] [5]] [5] 我尝试了使用tensorflow / deep learning的各种代码,在这些代码下无法进行概括并在运行它们时给出各种错误。

例如,我尝试了自动水印检测(https://github.com/rohitrango/automatic-watermark-detection),但是它不起作用。该库中的crop_watermark()函数不适用于我的图像。它正在裁剪图像的其他部分而不是水印,代码还有很多其他问题。

Similary我没有运气就尝试了其他许多深度学习库。

我也在考虑尝试cv2.inpaint(img,mask,3,cv2.INPAINT_TELEA),但是我没有遮罩图像。我只有一张带有水印的图像,如下所示,因此也无法使用inpaint()函数。

当前尝试通过以下简单代码找出水印在图像中的确切位置(通过手动裁剪水印并在原始图像中找到位置)。

import numpy as np
import cv2 
img = cv2.imread('original_image.jpeg')

print(img.shape)

h,w,c =  img.shape

logo = cv2.imread("cropped_image.jpeg")
print(logo.shape)
hl,wl,cl  =  logo.shape

x1 = int(w/2-wl/2)
y1 = int(h/2-hl)
x2 = int(w/2+wl/2)
y2 =  int(h/2)
cv2.rectangle(img, (x1, y1), (x2, y2), (255,0,0), 2)

cv2.imwrite("my.png",img)
cv2.imshow("lalala", img)

以上代码能够找到正确的水印坐标。从这里开始,我不知道如何继续删除水印。如果您能提供一些示例代码以及概念,那将是很棒的。

谢谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您可以尝试使用OpenCV contrib_module[ ['number' => '102-1'], ['number' => '102-2'], ['number' => '102-11'], ['number' => '105-1'], ['number' => '203-1'], ['number' => '302-1'], ['number' => '302-2'], ['number' => '419-1'], ['number' => '508-1'] ] 功能,您首先需要创建一个遮罩并指出图像上徽标所在的区域,然后传递图像和遮罩,然后结果将存储在目标图像中。

inpaint()

创建蒙版的一些提示:使用某些工具(图像编辑器)创建蒙版图像时,背景必须为黑色,徽标区域必须为白色。然后,在将之前创建的图像用作遮罩时,应首先将图像转换为灰色,然后使用@param src source image, it could be of any type and any number of channels from 1 to 4. In case of 3- and 4-channels images the function expect them in CIELab colorspace or similar one, where first color component shows intensity, while second and third shows colors. Nonetheless you can try any colorspaces. @param mask mask (CV_8UC1), where non-zero pixels indicate valid image area, while zero pixels indicate area to be inpainted @param dst destination image @param algorithmType see xphoto::InpaintTypes */ CV_EXPORTS_W void inpaint(const Mat &src, const Mat &mask, Mat &dst, const int algorithmType); 标志对图像进行阈值处理。


更新: 实现,这是代码,它是C ++语言,但是您可以考虑这些步骤,而且都一样。

THRESH_BINARY

您的原始图片:

enter image description here

使用的面罩:

enter image description here

最终结果:

enter image description here