Remove logo/watermark given locations from an image using python/opencv/deep learning

Question:

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.

Asked By: Abhay Kumar

||

Answers:

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:

enter image description here

The mask used:

enter image description here

The final result:

enter image description here

Answered By: Bahramdun Adil