Удалить текст из JPEG - PullRequest
       18

Удалить текст из JPEG

0 голосов
/ 23 сентября 2018

У меня есть JPEG, содержащий альфа-смешанный текст.Зная шрифт и размер, я вывел png-файл, представляющий текст

kitty with watermark watermark

Могу ли я получить ImageMagick?приблизительная исходная картинка?

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Вы можете сделать это в две строки кода.

import numpy as np
import cv2
import matplotlib.pyplot as plt
source_image = cv2.imread("6LfDs.png") #Image of cat with text watermark
text = cv2.imread("gJAAx.png", cv2.IMREAD_UNCHANGED) #Image of text

correcting_matrix = ((255 -text[:,:,3]) /255) #Matrix of "how much this pixel was darkened by applying text overlay"
original_image = (source_image / correcting_matrix[:,:,np.newaxis]).astype(np.uint8) 

cv2.imwrite("original_image.png", original_image)

Как это работает?Допустим, у вас есть пиксель кошки с текстом со значением 15, и вы знаете, что альфа-канал текста имеет значение 64.

Если альфа-канал имеет значение 64, мы знаем, что оригинальный пиксель был умножен на (255-64) / 255, что составляет 0,75.Исходное значение 15 / 0,75 = 20

Мы можем сделать это для каждого пикселя и получить исходное изображение enter image description here

0 голосов
/ 27 сентября 2018

Albert Myšák имеет подходящую технику, так как каждый знает точные значения альфа-канала для текста и уравнение, которое описывает, как альфа-канал смешивается с изображением. Слава!

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

Вот эквивалентная однострочная команда Imagemagick, разбитая на несколько строк продолжения для облегчения чтения и объяснения.

Line1 - read the kitty image
Line2 - copy it and make it all white rgb(255,255,255), save it into memory and delete the copy image from the image sequence
Line3 - read the watermark image and extract the alpha channel. Then subtract it from white
Line4 - divide the result of line 3 by the white image
Line5 - divide the kitty image by the result of line 4
Line6 - save the result to disk

convert kitty.png \
\( -clone 0 -fill white -colorize 100 -write mpr:white +delete \) \
\( watermark.png -alpha extract mpr:white -compose minus -composite \
mpr:white +swap -compose divide -composite \) \
+swap -compose divide -composite \
kitty_restored.png


enter image description here

0 голосов
/ 23 сентября 2018

Один из способов сделать это - использовать технику, называемую рисованием.Вы можете найти это в (Python) Skimage по адресу

http://scikit -image.org / docs / dev / api / skimage.restoration.html # inpaint-biharmonic

или в OpenCV по адресу

https://docs.opencv.org/3.0-beta/modules/photo/doc/inpainting.html https://docs.opencv.org/3.4.0/df/d3d/tutorial_py_inpainting.html

Вот обработка покраски Python Skimage:

изображение котенка:

enter image description here

изображение водяного знака:

enter image description here

Для рисования лыжного мага требуется изображение двоичной маски.Поэтому я могу преобразовать ваш водяной знак в такую ​​маску с помощью:

convert watermark.png -alpha extract -threshold 0 mask.png


маски изображения:

enter image description here

Воткод Python:

#!/opt/local/bin/python3.6

import numpy as np
import skimage.io
import skimage.restoration
import skimage.exposure

img = skimage.io.imread('/Users/fred/desktop/kitty.png')
msk = skimage.io.imread('/Users/fred/desktop/mask.png')
msk = skimage.exposure.rescale_intensity(msk, in_range='image', out_range=(0,1))
newimg = skimage.restoration.inpaint_biharmonic(img, msk, multichannel=True)
skimage.io.imsave('/Users/fred/desktop/kitty_inpaint_biharmonic.png', newimg)


enter image description here

У официальной версии Imagemagick этого нет.Но пользователь snibgo на форуме Imagemagick реализовал пользовательскую версию, которую он называет «заполнение дырок» в http://im.snibgo.com/fillholespri.htm.. Он показывает пример в https://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=28640#p127233.

Кроме того, на той же странице онпоказывает некоторый умный код Imagemagick, который повторяет небольшие изменения размера.Это достигает некоторого подобного результата к рисованию.Но в целом это будет не так хорошо, как рисование.Тем не менее, он работает довольно хорошо для вашего изображения.

изображение котенка:

enter image description here

изображение водяного знака:

enter image description here

Сначала я должен взять ваше изображение водяного знака и извлечь из него двоичное изображение, где текст белый, а фон черный.Затем я использую его, чтобы сделать изображение котенка прозрачным там, где находится текст.Затем я обрезаю область текста, чтобы ускорить последующую обработку.

convert kitty.png \
\( watermark.png -alpha extract -threshold 0 -negate \) \
-alpha off -compose copy_opacity -composite \
-crop 490x102+235+150 +repage tmp1.png


enter image description here

Затем я запускаю его довольно долгопоследовательность последовательного изменения размера изображения с последующим объединением всех слоев и изменением размера до исходного размера.

convert tmp1.png \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
\( +clone -resize 90.9091% \) \
-layers RemoveDups \
-filter Gaussian -resize 490x102! \
-background None \
-compose DstOver -layers merge \
-alpha opaque \
tmp2.png


enter image description here

Затем, наконец,Я комбинирую этот результат обратно в место на изображении котенка, из которого я его обрезал.

convert kitty.png tmp2.png -geometry +235+150 -compose over -composite kitty2.png


enter image description here

При полном разрешенииВы все еще можете различить очень слабый текст на этом изображении.Результат Skimage лучше, как можно увидеть, быстро чередуя два изображения.

...