从 jpeg 中删除文本
Remove text from jpeg
我有一个包含 alpha 混合文本的 jpeg。知道字体和大小,我推导出一个代表文本的png文件
使用ImageMagick,我可以得到原始图片的近似值吗?
执行此操作的一种方法是使用一种称为修复的技术。您可以在
的 (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修复处理:
猫咪图片:
水印图片:
Skimage 修复需要二进制蒙版图像。所以我可以通过以下方式将您的水印转换为这样的蒙版:
convert watermark.png -alpha extract -threshold 0 mask.png
蒙版图片:
这里是 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)
Imagemagick 没有官方版本。但是 Imagemagick 论坛上的用户 snibgo 在 http://im.snibgo.com/fillholespri.htm. He shows an example at https://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=28640#p127233 上实现了一个他称之为 'hole filling' 的自定义版本。
此外,在同一页面上,他还展示了一些巧妙的 Imagemagick 代码,这些代码可以重复少量调整大小。这实现了与修复有些相似的结果。但总的来说,它不会像修复一样好。尽管如此,它确实对您的图像效果还算不错。
猫咪图片:
水印图片:
首先,我必须获取您的水印图像并从中提取文本为白色、背景为黑色的二值图像。然后我用它使小猫图像在文本所在的位置透明。然后我裁剪掉文字的区域只是为了让后续处理更快。
convert kitty.png \
\( watermark.png -alpha extract -threshold 0 -negate \) \
-alpha off -compose copy_opacity -composite \
-crop 490x102+235+150 +repage tmp1.png
然后我 运行 他连续调整图像大小的相当长的序列,然后合并所有图层并调整回原始大小。
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
然后最后,我将这个结果合成回小猫图像上我裁剪它的地方。
convert kitty.png tmp2.png -geometry +235+150 -compose over -composite kitty2.png
在全分辨率下,您仍然可以辨认出这张图片中残留的非常微弱的文字。通过快速交替两个图像可以看出 Skimage 结果更好。
您可以用两行代码完成此操作。
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,并且您知道文本的 alpha 通道值为 64。
如果 alpha 通道的值为 64,我们知道原始像素乘以 (255-64)/255,即 0.75。原始值为 15/0.75 = 20
我们可以对每个像素都这样做并得到原始图像
Albert Myšák
在这里使用了正确的技术,因为人们知道文本的确切 alpha 通道值以及描述 alpha 通道如何与图像混合的等式。 荣誉!
我早期的方法更适合只知道图像中文本像素位置的情况,这样就可以制作二进制蒙版或将文本转换为透明度或任何修复软件所需的其他颜色使用过。
这里是等效的一行 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
我有一个包含 alpha 混合文本的 jpeg。知道字体和大小,我推导出一个代表文本的png文件
使用ImageMagick,我可以得到原始图片的近似值吗?
执行此操作的一种方法是使用一种称为修复的技术。您可以在
的 (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修复处理:
猫咪图片:
水印图片:
Skimage 修复需要二进制蒙版图像。所以我可以通过以下方式将您的水印转换为这样的蒙版:
convert watermark.png -alpha extract -threshold 0 mask.png
蒙版图片:
这里是 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)
Imagemagick 没有官方版本。但是 Imagemagick 论坛上的用户 snibgo 在 http://im.snibgo.com/fillholespri.htm. He shows an example at https://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=28640#p127233 上实现了一个他称之为 'hole filling' 的自定义版本。
此外,在同一页面上,他还展示了一些巧妙的 Imagemagick 代码,这些代码可以重复少量调整大小。这实现了与修复有些相似的结果。但总的来说,它不会像修复一样好。尽管如此,它确实对您的图像效果还算不错。
猫咪图片:
水印图片:
首先,我必须获取您的水印图像并从中提取文本为白色、背景为黑色的二值图像。然后我用它使小猫图像在文本所在的位置透明。然后我裁剪掉文字的区域只是为了让后续处理更快。
convert kitty.png \
\( watermark.png -alpha extract -threshold 0 -negate \) \
-alpha off -compose copy_opacity -composite \
-crop 490x102+235+150 +repage tmp1.png
然后我 运行 他连续调整图像大小的相当长的序列,然后合并所有图层并调整回原始大小。
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
然后最后,我将这个结果合成回小猫图像上我裁剪它的地方。
convert kitty.png tmp2.png -geometry +235+150 -compose over -composite kitty2.png
在全分辨率下,您仍然可以辨认出这张图片中残留的非常微弱的文字。通过快速交替两个图像可以看出 Skimage 结果更好。
您可以用两行代码完成此操作。
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,并且您知道文本的 alpha 通道值为 64。
如果 alpha 通道的值为 64,我们知道原始像素乘以 (255-64)/255,即 0.75。原始值为 15/0.75 = 20
我们可以对每个像素都这样做并得到原始图像
Albert Myšák
在这里使用了正确的技术,因为人们知道文本的确切 alpha 通道值以及描述 alpha 通道如何与图像混合的等式。 荣誉!
我早期的方法更适合只知道图像中文本像素位置的情况,这样就可以制作二进制蒙版或将文本转换为透明度或任何修复软件所需的其他颜色使用过。
这里是等效的一行 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