如何去除图片的白色背景并使其透明?

3
我正在尝试通过编程的方式去除几张图片的白色背景并使其透明。这些图片的格式很简单,有一个白色背景和一个主要位于中心位置的对象。
我想复制https://remove.bg网站的功能,使图像的背景变成透明。
我已经尝试使用sharpimageMagick软件使背景透明。但是这会使一些主要对象内部的像素也变成透明的,这绝对不是我想要的。
我在imageMagik中使用以下代码将白色背景转换为透明: convert brownie.jpg -transparent white brownie.png convert cakebig.jpg -fuzz 1% -transparent white cakebig.png 似乎并没有完美地工作。
运行命令后,图像确实变成了透明的,但是主要对象内部的几个像素也受到了影响。
输入图像 Input

来自ImageMagik的输出(查看主要对象内部的某些像素变为透明) Image magik

来自https://remove.bg的预期输出(在主要对象上没有影响) Expected Output

这似乎是一个图像处理问题,OpenCV似乎是最佳解决方案。我对该库不是很了解,所以有点棘手。我正在查看一些代码,并遇到了可以用于图像分割的grab cutgraph cut算法。但我并不完全确定。请帮助在OpenCV中找到正确的解决方案。


请参见以下链接,了解如何使用PIL将所有白色像素变为透明:https://dev59.com/9HRA5IYBdhLWcg3w9yx0 - Reiner Czerwinski
@ReinerCzerwinski 我不想将所有白色像素都变成透明的,只想将背景中的白色像素变成透明的,而不是前景中存在的白色像素。 - Abhishek Rastogi
1
反向阈值化以掩盖中心的主要斑点,填充可能的孔(来自白色像素),将此掩码用作Alpha通道,也许在掩码上应用高斯模糊以平滑轮廓。 - HansHirse
3
正如你所发现的,-transparent 影响图像中的所有像素,甚至包括冰淇淋内部。相反,使用从左上角开始并在遇到非白色像素时停止的泛洪填充,这样它只会影响与左上角相连的其他白色像素... convert dessert.png -fill none -fuzz 2% -draw 'alpha 0,0 floodfill' result.png 你可能需要将magick更改为convert和/或将alpha更改为matte - Mark Setchell
非常感谢@MarkSetchell,那个方法有效 :) - Abhishek Rastogi
1个回答

5
我将在Mark Setchell卓越的ImageMagick答案基础上添加一些内容,关于如何使用模糊泛洪填充功能。通过稍微模糊alpha通道并将模糊值置为灰色中间值以下以实现一些抗锯齿效果,这可以平滑模糊泛洪填充后留下的锯齿边缘。需要注意的是,如果设置的fuzz值过大,会导致渗漏到你的冰淇淋里面,因为冰淇淋颜色与背景颜色相似。而设置过小的fuzz值则无法充分地去除背景。因此,在这张图片中,fuzz值的容差要很小。
输入:

enter image description here

对于ImageMagick 6:
convert img.png -fuzz 2% -fill none -draw "matte 0,0 floodfill" -channel alpha -blur 0x2 -level 50x100% +channel result.png

对于Imagemagick 7:
magick img.png -fuzz 2% -fill none -draw "alpha 0,0 floodfill" -channel alpha -blur 0x2 -level 50x100% +channel result.png


在此输入图像描述

您需要下载结果来查看背景是否透明,轮廓是否平滑。


感谢您的快速回复。不幸的是,出现了相同的错误。请查看完整的错误和版本输出@https://gist.github.com/rynop/f8fce887780e5ac1d05a4027922fc74d - rynop
1
抱歉,当你发帖时我在编辑我的命令。请看我的最后一条评论。尝试这个:magick img.png -fuzz 2% -fill none -draw“alpha 0,0 floodfill” -channel alpha -blur 0x2 -level 50x100% +通道 result.png - fmw42
工作正常 - 谢谢!输出仍然不如www.remove.bg(边缘被撕裂/“粗糙”)。 “fuzz”是要调整以获得更好结果的正确选项吗? 您有没有想法,remove.bg如何在没有任何配置的情况下做得这么好? - rynop
remove.bg 使用深度学习(AI)和大量的训练,据我所知。我对他们的工作没有更多的了解。但简单的图像处理是不够的。调整模糊和/或模糊值。发布您的图像,我可以看一下。如果背景不几乎恒定,则泛洪填充将无法正常工作。因此,这真的取决于背景。 - fmw42
没问题。我愿意看一看。但请随意。 - fmw42
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接