使用python/opencv/deep learning从图像中删除徽标/水印给定的位置 [英] Remove logo/watermark given locations from an image using python/opencv/deep learning

查看:57
本文介绍了使用python/opencv/deep learning从图像中删除徽标/水印给定的位置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

以下是原始图片:[![original_image.jpeg] [1]] [1]原始图片2:[![在此处输入代码此处提供图片说明] [2]] [2]原始图片3:[![在此处输入图片描述] [3]] [3]

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

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

例如,我尝试使用自动水印检测(

使用的面罩:

最终结果:

I am very new to opencv and deep learning using python. I am trying to remove watermark/logo from an image. I am able to find location of watermark by finding the location of cropped watermark image in the original image in the image which is constant for all the images. I need to remove found watermark.

Here is original image:[![original_image.jpeg][1]][1] Original image2:[![enenter code hereter image description here][2]][2] Original image3:[![enter image description here][3]][3]

Cropped watermark image from original image: [![cropped_image.jpeg][4]][4]

Located watermark in the image: [![Located watermark][5]][5] I tried various code which uses tensorflow/deep learning below which din't generalise and given various error while running them.

For example I tried automatic-watermark-detection( https://github.com/rohitrango/automatic-watermark-detection) but it din't work. The crop_watermark() function in this library was not working for my image.It was cropping some other part of the image which is not water mark there was many other issue with code as well.

Similary I tried many other deep learning library with no luck.

I was also thinking to try cv2.inpaint(img,mask,3,cv2.INPAINT_TELEA) but I don't have mask image. I have only one image with watermark on it as below so not able to use inpaint() function as well.

Currently trying below simple code to find out exact location of the watermark in the image (by cropping the water mark manually and finding the location in the original image).

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)

Above code is able to find correct coordinates of watermark. From here onwards I don't know how to proceed to remove watermark. It will be great if you can provide some sample code as well along with concept.

Thank you for help.

解决方案

You can try inpaint() function of the OpenCV contrib_module, which you first need to create a mask and indicate the area where the logo is there on the image, then pass the image and the mask, and then the result will be stored in the destination image.

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

Some hints to create the mask: When you created the mask image by some tools (image editor), the background must be in black and the logo area must be in white. And then when the image created before used it as the mask, you should first convert the image to gray, and then threshold the image with THRESH_BINARY flag.


Update: The implementation, this is the code, it is in C++, but you can consider the steps and it is all the same.

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

Your original image:

The mask used:

The final result:

这篇关于使用python/opencv/deep learning从图像中删除徽标/水印给定的位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆