使用 python/opencv/深度学习从图像中删除给定位置的徽标/水印

Posted

技术标签:

【中文标题】使用 python/opencv/深度学习从图像中删除给定位置的徽标/水印【英文标题】:Remove logo/watermark given locations from an image using python/opencv/deep learning 【发布时间】:2019-09-12 15:12:10 【问题描述】:

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

这是原图:[![original_image.jpeg][1]][1] 原图2:[![enenter code hereter 这里有图片描述][2]][2] 原图3:[![在此处输入图片描述][3]][3]

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

图片中的定位水印: [![定位水印][5]][5] 我尝试了各种使用 tensorflow/deep learning 的代码,这些代码没有泛化,并且在运行它们时给出了各种错误。

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

类似地,我尝试了许多其他深度学习库,但都没有成功。

我也想试试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)

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

感谢您的帮助。

【问题讨论】:

你看过这个吗:***.com/questions/32125281/… 我看到了,但它是用 c++ 编写的,我没试过。现在正在尝试实施已接受答案中提到的概念。 形态过滤为我的图像提供相同的图像,与教程中提到的不同。无法继续下一步。 【参考方案1】:

你可以试试OpenCVcontrib_module的inpaint()函数,首先需要创建一个遮罩,并在图像上标出logo所在的区域,然后传递图像和遮罩,然后传递结果将存储在目标图像中。

@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);

制作蒙版的一些提示: 当您使用某些工具(图像编辑器)创建蒙版图像时,背景必须为黑色,徽标区域必须为白色。然后当之前创建的图像将其用作蒙版时,应先将图像转换为灰色,然后将图像用THRESH_BINARY标志进行阈值处理。


更新: 实现,这是代码,是C++的,但你可以考虑步骤,都是一样的。

cv::namedWindow("Original_Image", cv::WINDOW_FREERATIO);
cv::namedWindow("Result", cv::WINDOW_FREERATIO);
cv::Mat originalImg = cv::imread("y25av.jpg");
cv::Mat mask = cv::imread("mask.jpg");

// to gray
cv::Mat gray;
cv::cvtColor(mask, gray, cv::COLOR_BGR2GRAY);
cv::threshold(gray, mask, 180, 255, cv::THRESH_BINARY);

cv::Mat dst;
cv::inpaint(originalImg, mask, dst, 10, cv::INPAINT_TELEA);

cv::imshow("Original_Image", originalImg);
cv::imshow("Result", dst);
cv::waitKey();

您的原始图片:

使用的掩码:

最终结果:

【讨论】:

感谢您的回答。如何制作面具?我只有一张带水印的图片。请帮我完成这一步。 @AbhayKumar 我已经编辑了答案,你可以看看更新的部分。 @AbhayKumar 我会尝试这样做,我会更新答案,你应该稍后检查。 我已经告诉过你,创建的蒙版必须适合100%的logo区域,昨天我没有太多时间为你做,但是因为你不知道创建所以我创建了一个给你,然后给你简单的代码。而且您只提供了一张示例图片,我已经为您完成了。不管怎样,现在你可以创建一个 100% 合身的面具,然后你可以玩 inpaintRadiusflags,尝试不同的值和标志,看看结果。 @DataGirl 一定要适合准确的位置,如果你能计算出每张幻灯片中logo的移动偏移量,那么你就可以移动蒙版以适合每张幻灯片中的位置。

以上是关于使用 python/opencv/深度学习从图像中删除给定位置的徽标/水印的主要内容,如果未能解决你的问题,请参考以下文章

使用Python,OpenCV和深度学习进行全面嵌套边缘检测

一行代码实现灰色铅笔画彩色铅笔画和卡通画效果(C++/Python OpenCV源码)

深度学习之Python,OpenCV中的卷积

基于python+opencv的人脸检测+

Python/OpenCV - 基于机器学习的 OCR(图像到文本)

使用PythonOpenCV翻转图像(水平垂直水平垂直翻转)