Я использовал 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 и то, что я получаю из кода
Я попытался нейтрализовать водяной знак исходного изображения с помощью инверсного изображения водяного знака на белом фоне.
Но теперь он не продвигается, и я не знаю, что с ним случилось.
Я немного погуглил и нашел информацию об этом, но в моем случае у меня есть маска. Как я могу добиться этого с моим текущим кодом? Любая помощь приветствуется.
источник
маска
результат






ок, я не понял вашего алгоритма "нейтрализации":
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)