Удалите логотип / водяной знак, указанные места с изображения, используя Python / OpenCV / глубокое обучение - PullRequest
0 голосов
/ 23 апреля 2019

Я очень новичок в opencv и глубоком изучении с использованием python.Я пытаюсь удалить водяной знак / логотип с изображения.Я могу найти местоположение водяного знака путем нахождения местоположения обрезанного изображения водяного знака в исходном изображении на изображении, которое является постоянным для всех изображений.Мне нужно удалить найденный водяной знак.

Вот исходное изображение: [! [Original_image.jpeg] [1]] [1] Исходное изображение2: [! [En enter code here ter описание изображения здесь] [2]] [2] Исходное изображение3: [! [Введите описание изображения здесь] [3]] [3]

Обрезанное изображение водяного знака из исходного изображения: [! [Cropped_image.jpeg] [4]] [4]

Расположенный водяной знак на изображении: [! [Расположенный водяной знак] [5]] [5] Я пробовал различный код, использующий тензорный поток / глубокое обучение, ниже которого не обобщаются и приводят к различным ошибкам при их запуске.

Например, я попробовал автоматическое определение водяного знака (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 Ответ

1 голос
/ 23 апреля 2019

Вы можете попробовать inpaint() функцию OpenCV contrib_module , для которой вам сначала нужно создать маску и указать область, где логотип находится на изображении, затем передать изображение и маску,и затем результат будет сохранен в целевом изображении.

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

Ваше исходное изображение:

enter image description here

Используемая маска:

enter image description here

Окончательный результат:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...