imagemagick:如何使用抗锯齿更改图像的背景颜色

den*_*pro 6 anti-aliasing imagemagick images

狐狸

我只想养狐狸。那就是用imagemagick把图片的白色背景色改成透明的。

抗锯齿难处理,图像边缘呈锯齿状。

我试过了。

这是代码:

convert fox.jpeg -alpha set -channel RGBA \
-fill none -opaque white fox_one.jpeg 

convert fox.jpeg -matte -fill none \
-draw 'color 0,0 replace' fox_two.jpeg
Run Code Online (Sandbox Code Playgroud)

两者都失败了

在此处输入图片说明

我是根据color_basics/#replace 做的

有更准确的文档推荐吗?以及如何修复它?

Ana*_*man 7

不幸的是,与您之前关于图标的问题不同,有很多方法可以使用更复杂的图像来处理背景去除……所以可能没有一个“好的”解决方案。也就是说,对于您发布的示例,这里有一些可能更令人满意的方法。


虽然我在下面给出了我的建议,但可能有更好的方法来做我目前不知道的事情。请原谅我可能忽略的任何错误、遗漏或事情。=)


简单的单色透明

要将单一颜色(例如背景)转换为透明,您可以使用:

convert fox.jpg -transparent white fox_transparent.png
Run Code Online (Sandbox Code Playgroud)

但是,这会产生与您的不良图像相同的结果,这是不可取的:

前任。fox_transparent

fox_transparent_nofuzz

这是因为白色区域(上图)并不是真正的白色(它们是灰白色的,主要是由于您已经注意到的抗锯齿)。为了解决这个问题,一种可能的选择是使用-fuzz来选择几乎(几乎)白色的像素:

convert fox.jpg -fuzz 11% -transparent white fox_transparent_fuzzed.png
Run Code Online (Sandbox Code Playgroud)

这会产生更好的结果:

前任。fox_transparent_fuzzed

fox_transparent_fuzzed


更好的边缘 (?)

虽然简单地使用-fuzz可能效果很好,但仍然可能存在不希望的粗糙度:

前任。fox_transparent_fuzzed - 粗糙的边缘

fox_transparent_fuzzed_jaggies

为了解决这个问题,我们可以使用一个模糊的蒙版来帮助柔化图像的边缘。为了一步到位,我们可以从这个论坛帖子中获取一些代码并像这样使用它:

convert fox.jpg ( -clone 0 -fuzz 11% -transparent white -blur 0x1 ) -compose copy_opacity -composite fox_transparent_fuzzed_blurry_mask.png
Run Code Online (Sandbox Code Playgroud)

此命令创建一个模糊蒙版,然后与原始图像合成。这是结果:

前任。fox_transparent_fuzzed_blurry_mask

fox_transparent_fuzzed_blurry_mask

您可以看到边缘现在更柔和了:

fox_transparent_fuzzed_nojaggies

如有必要,我们可以分两步做类似的事情:

convert fox.jpg -type Grayscale -negate -fill white -fuzz 11% +opaque "#000000" -blur 0x1 fox_blur_mask.jpg
convert fox.jpg fox_blur_mask.jpg -compose copy_opacity -composite fox_transparent_blur_mask_result.png
Run Code Online (Sandbox Code Playgroud)

第一条命令:

  • 创建图像的黑白版本 ( -type Grayscale)。

  • (有效地)为了掩蔽目的反转颜色(-negate)。

  • 用于-fill white -fuzz 11% +opaque "#000000"用白色填充狐狸的头部(因此我们可以看到大部分原始图像)。

  • 将灯光-blur 0x1应用于图像。

这是生成的蒙版,黑色的所有内容在最终图像中都变得透明:

前任。fox_blur_mask

fox_blur_mask

第二个命令简单地将原始图像和蒙版组合在一起以获得此结果:

前任。fox_transparent_blur_mask_result

fox_transparent_blur_mask_result

您会注意到结果与之前给出的“all together”示例几乎相同:

fox_transparent_fuzzed_blurry_mask fox_transparent_blur_mask_result


注意事项

  • 如前所述,给出的建议并不是完成任务的唯一方法,并且可能有给出的命令的替代/更好版本。

  • 这些示例假设原始图像中没有透明度。如果有,您可能必须使用不同的选项/命令。同样,这些建议仅使用 .jpg 文件作为输入格式和 .png 文件作为输出格式进行了测试。

  • 的基本缺点-fuzz是很难以一致的方式应用。-fuzz 11%是最适合示例图像的方法。-fuzz 10%fuzz 12%可能会留下不需要的杂散像素。其他-fuzz图像可能需要其他值。

  • 这些建议没有解决任何方法来保持图像的某些部分与您的背景颜色相同(例如狐狸的白眼睛)。为此,您可能想要 A) 更改最终示例中的掩码,或者 B) 如果您想要类似于顶部第二个示例的内容,请使用例如

    convert fox.jpg -bordercolor white -border 1x1 -fuzz 11% -fill none -floodfill +0+0 white -shave 1x1 fox_flood_2_minimal.png
    
    Run Code Online (Sandbox Code Playgroud)
  • 请注意,上面的命令是从已经提供的屏蔽链接复制的。

  • 我认为好奇心是一种令人钦佩的品质。如果有人根本不问,他们永远不会知道正确的问题。 =)无论如何,我很高兴这有帮助。祝你好运! =) (2认同)