Удаление водяного знака с помощью opencv в python

Я использовал OpenCV и Python для удаления водяного знака с изображения, используя приведенный ниже код.

import cv2
import numpy

src = cv2.imread('src.jpg')
mask = cv2.imread('mask.jpg')
save = numpy.zeros(src.shape, numpy.uint8) 

for row in range(src.shape[0]):
    for col in range(src.shape[1]):
        for channel in range(src.shape[2]):
            if mask[row, col, channel] == 0:
                val = 0
            else:
                reverse_val = 255 - src[row, col, channel]
                val = 255 - reverse_val * 256 / mask[row, col, channel]
                if val < 0: val = 0

            save[row, col, channel] = val

cv2.imwrite('result.jpg', save)

Вот файлы src, mask и то, что я получаю из кода

Я попытался нейтрализовать водяной знак исходного изображения с помощью инверсного изображения водяного знака на белом фоне.

Но теперь он не продвигается, и я не знаю, что с ним случилось.

Я немного погуглил и нашел информацию об этом, но в моем случае у меня есть маска. Как я могу добиться этого с моим текущим кодом? Любая помощь приветствуется.

источник

маска

результат

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
102
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ок, я не понял вашего алгоритма "нейтрализации":

reverse_val = 255 - src[row, col, channel]
val = 255 - reverse_val * 256 / mask[row, col, channel]

Но я могу сказать вам, почему это не работает. Когда вы читаете изображение маски mask = cv2.imread('mask.jpg'), вы читаете его как обычное изображение с белым фоном и водяным знаком. Вы должны сделать из этого бинарное изображение, чтобы вы понимали, какие пиксели вам нужно нейтрализовать:

threshed = cv2.inRange(mask, 0, 254)

И вы получите что-то вроде этого:
Итак, теперь вам нужно нейтрализовать «белые» пиксели маски на исходном изображении. (НО! Вы должны помнить, что бинарное изображение и изображение в градациях серого имеют только один канал).
Как я уже говорил: я не понял вашего алгоритма "нейтрализации", потому что когда я его использую - я получаю вот такое изображение:
Поэтому я рекомендую вам просто сделать все пиксели белыми: И полный код:

import cv2
import numpy


src = cv2.imread("src.jpg")
mask = cv2.imread("mask.jpg", cv2.IMREAD_GRAYSCALE)
save = numpy.zeros(src.shape, numpy.uint8)

threshed = cv2.inRange(mask, 0, 254)


def get_reversed(values: tuple) -> tuple:
    return 255 - values[0], 255 - values[1], 255 - values[2]


def get_processed(values: tuple, mask: int) -> tuple:
    return 255 - values[0] * 256 / mask, 255 - values[1] * 256 / mask, 255 - values[2] * 256 / mask


for row in range(src.shape[0]):
    for col in range(src.shape[1]):
        if threshed[row, col] != 0:
            # save[row, col] = get_reversed(src[row, col])
            save[row, col] = (255, 255, 255)
            # reverse_val = get_reversed(src[row, col])
            # val = get_processed(reverse_val, mask[row, col])
        else:
            save[row, col] = src[row, col]


cv2.imwrite('result.jpg', save)

Другие вопросы по теме