使用图像魔法从图像中删除背景(任何颜色)

问题描述 投票:0回答:3

嗨,我问这个问题是参考这个问题模糊洪水填充ImageMagic php - 制作透明图像

 #!/bin/bash

# Get size of original
sz=$(convert -format "%wx%h" phone.png info:)

# Floodfill background area with transparency
convert phone.png -fuzz 5% -fill none -draw 'color 0,0 floodfill' ObjectOnTransparent.png

# Extract alpha channel
convert ObjectOnTransparent.png -alpha extract Alpha.png

# Extract edges of alpha channel - experiment with thickness
convert Alpha.png -edge 1 AlphaEdges.png

# Get difference from background for all pixels
convert phone.png \( +clone -fill white -colorize 100% \) -compose difference -composite Diff.png

# Multiply edges with difference, so only edge pixels will have a chance of getting through to final mask
convert AlphaEdges.png Diff.png -compose multiply -composite EdgexDiff.png

# Extend Alpha by differences at edges
convert Alpha.png EdgexDiff.png -compose add -composite ReEdgedAlpha.png

# Apply new alpha to original image
convert phone.png \( ReEdgedAlpha.png -colorspace gray \) -compose copyopacity -composite RemaskedPhone.png

# Splat RemaskedPhone over red background
convert -size $sz xc:red RemaskedPhone.png -composite Result.png

我运行了这些脚本,它在白色背景的图像上运行准确,并且产生干净的边缘,但我想问是否有任何方法可以从像这样的图像中删除任何颜色背景https:// ibb.co/BNWnNBs 我想从中删除图像角落的黑色,如下所示 https://ibb.co/x7nD8Vb.

任何帮助表示感谢,谢谢

image-processing imagemagick
3个回答
4
投票

这在 Unix 语法的 ImageMagick 6 中对我有用。

输入:

convert eagle.png -alpha off -fuzz 10% -fill none -draw "matte 0,0 floodfill"  \
\( +clone -alpha extract -blur 0x2 -level 50x100% \) \
-alpha off -compose copy_opacity -composite \
eagle_transp.png

结果:

Windows 语法为:

convert eagle.png -alpha off -fuzz 10% -fill none -draw "matte 0,0 floodfill"  ^
( +clone -alpha extract -blur 0x2 -level 50x100% ) ^
-alpha off -compose copy_opacity -composite ^
eagle_transp.png

如果在 .bat 脚本中,请将

%
加倍为
%%


2
投票

为了回答您有关新图像的问题,该图像有两个不同之处。首先,透明像素下的背景不是全白的。其次,白色区域并不遍布图像周围。所以在ImageMagick中,你需要做两个额外的步骤。

输入:

您可以通过关闭图像上的 Alpha 来看到第一个问题:

magick target-transp.png -alpha off target-transp_alpha_off.png

注意左上角的黑色区域。所以在处理时我们需要把黑色区域变成白色。

其次,正如您在上图中看到的,白色区域并没有遍布图像周围。因此,我们需要用四边 1 像素宽的白色边框填充图像。

因此您可以执行以下两个过程之一:

  1. 洪水填满白色

     magick target-transp.png \
     -background white -alpha background -alpha off \
     -bordercolor white -border 1 \
     -fuzz 10% -fill none -draw "alpha 0,0 floodfill"  \
     \( +clone -alpha extract -blur 0x2 -level 50x100% \) \
     -alpha off -compose copy_opacity -composite \
     -shave 1x1 \
     target-transp_proc1.png
    

  1. 或使所有白色像素透明,包括某些字母内部,例如“a”和“e”的内部

     magick target-transp.png \
     -background white -alpha background -alpha off \
     -bordercolor white -border 1 \
     -fuzz 10% -transparent white  \
     \( +clone -alpha extract -blur 0x2 -level 50x100% \) \
     -alpha off -compose copy_opacity -composite \
     -shave 1x1 \
     target-transp_proc2.png
    

您需要下载结果图像才能看到差异。


1
投票

如果要填充透明度,则更改

convert phone.png -fuzz 5% -fill none -draw 'color 0,0 floodfill' ObjectOnTransparent.png

convert phone.png -fuzz 5% -fill none -draw 'matte 0,0 floodfill' ObjectOnTransparent.png

然后对边缘进行抗锯齿,更改

convert phone.png \( ReEdgedAlpha.png -colorspace gray \) -compose copyopacity -composite RemaskedPhone.png

convert phone.png \( ReEdgedAlpha.png -colorspace gray -blur 0x2 -level 50x100% \) -compose copyopacity -composite RemaskedPhone.png

添加

你写道:

我更改了步骤并运行命令,但它没有删除外部 相反,黑色图像是相同的

输入:

因此,增加模糊值并将洪水填充种子点稍微移离左上角

convert Remasked-Phone.png -fuzz 30% -fill none -draw 'matte 3,3 floodfill' ObjectOnTransparent.png

结果:

© www.soinside.com 2019 - 2024. All rights reserved.