Image processing 从jpeg中删除文本

Image processing 从jpeg中删除文本,image-processing,imagemagick,alpha,Image Processing,Imagemagick,Alpha,我有一个包含alpha混合文本的jpeg。知道了字体和大小,我推断出一个代表文本的png文件 使用ImageMagick,我可以得到原始图片的近似值吗?一种方法是使用一种称为修复的技术。你可以在Python Skipage的 或者在OpenCV中 以下是Python Skipage修复处理: 基蒂形象: 水印图像: 略读修复需要一个二值掩模图像。因此,我可以通过以下方式将您的水印转换为此类掩码: convert watermark.png -alpha extract -thresho

我有一个包含alpha混合文本的jpeg。知道了字体和大小,我推断出一个代表文本的png文件


使用ImageMagick,我可以得到原始图片的近似值吗?

一种方法是使用一种称为修复的技术。你可以在Python Skipage的

或者在OpenCV中

以下是Python Skipage修复处理:

基蒂形象:

水印图像:

略读修复需要一个二值掩模图像。因此,我可以通过以下方式将您的水印转换为此类掩码:

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已经实现了一个他称之为“漏洞填充”的定制版本。他举了一个例子

此外,在同一页上,他展示了一些聪明的Imagemagick代码,这些代码可以重复进行少量的大小调整。这达到了与修复类似的效果。但总的来说,它不如修补好。尽管如此,它对你的形象还是有一定的帮助

基蒂形象:

水印图像:

首先,我必须获取你的水印图像,并从中提取一个二值图像,其中文本为白色,背景为黑色。然后我使用它使文本所在的kitty图像透明。然后我裁剪出文本区域,以加快后续处理

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


在全分辨率下,您仍然可以分辨出此图像中残留的非常微弱的文本。快速交替两幅图像可以看出,略读效果更好。

一种方法是使用一种称为修复的技术。你可以在Python Skipage的

或者在OpenCV中

以下是Python Skipage修复处理:

基蒂形象:

水印图像:

略读修复需要一个二值掩模图像。因此,我可以通过以下方式将您的水印转换为此类掩码:

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已经实现了一个他称之为“漏洞填充”的定制版本。他举了一个例子

此外,在同一页上,他展示了一些聪明的Imagemagick代码,这些代码可以重复进行少量的大小调整。这达到了与修复类似的效果。但总的来说,它不如修补好。尽管如此,它对你的形象还是有一定的帮助

基蒂形象:

水印图像:

首先,我必须获取你的水印图像,并从中提取一个二值图像,其中文本为白色,背景为黑色。然后我使用它使文本所在的kitty图像透明。然后我裁剪出文本区域,以加快后续处理

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


在全分辨率下,您仍然可以分辨出此图像中残留的非常微弱的文本。快速交替两幅图像可以看出,略读效果更好。

您可以用两行代码来完成

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)
这是怎么回事?假设cat的像素和文本的值为15,并且您知道文本的alpha通道的值为64

如果alpha通道的值为64,我们知道原始像素乘以255-64/255,即0.75。原始值为15/0.75=20

我们可以对每个像素执行此操作并获得原始图像

您可以通过两行代码来完成此操作

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)
这是怎么回事?假设cat的像素和文本的值为15,并且您知道文本的alpha通道的值为64

如果alpha通道的值为64,我们知道原始像素乘以255-64/255,即0.75。原始值为15/0.75=20

我们可以对每个像素执行此操作并获得原始图像 阿尔伯特·梅沙克在这里有合适的技巧,因为我们知道文本的确切阿尔法通道值以及描述阿尔法通道如何与图像混合的方程式。荣誉

我以前的方法更适合于只知道文本像素在图像中的位置的情况,这样就可以制作一个二值遮罩,或者将文本转换为使用任何修复软件所需的透明度或其他颜色

下面是等效的一行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
阿尔伯特·梅沙克在这里有合适的技巧,因为我们知道文本的确切阿尔法通道值以及描述阿尔法通道如何与图像混合的方程式。荣誉

我以前的方法更适合于只知道文本像素在图像中的位置的情况,这样就可以制作一个二值遮罩,或者将文本转换为使用任何修复软件所需的透明度或其他颜色

下面是等效的一行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

如果有人只想从水印中删除一个字符,并想将e替换为e,并且处理后的最终拼写应该是Watarmak,该怎么做?请建议如果有人只想从水印中删除一个字符,并想将e替换为e,并且处理后的最终拼写应该是Watarmak,如何操作?请建议如果有人只想从水印中删除一个字符,并想将e替换为e,并且处理后的最终拼写应该是Watarmak,如何操作?请建议如果有人只想从水印中删除一个字符,并想将e替换为e,并且处理后的最终拼写应该是Watarmak,如何操作?请建议