【问题标题】:How to remove white background of image and make it transparent?如何去除图像的白色背景并使其透明?
【发布时间】:2020-01-13 02:40:58
【问题描述】:

我正在尝试以编程方式删除少数图像的白色背景并使其透明。图像的格式很简单,它有一个白色的背景和一个主要位于中间的对象。

我想复制https://remove.bg 网站的功能,使图像的背景透明。

我曾尝试使用sharpimageMagick 软件使背景透明。但它也使主要对象内部的一些像素变得透明。我绝对不想要。

imageMagik 中使用以下代码将白色背景转换为透明

convert brownie.jpg -transparent white brownie.png

convert cakebig.jpg -fuzz 1% -transparent white cakebig.png

似乎并不完美。

运行命令后,图像确实变得透明了,但主要对象内的一些像素也受到了影响。

输入图像

ImageMagik 的输出(查看主要对象内的某些像素如何变得透明)

来自https://remove.bg 的预期输出(看不到对主对象的影响)

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

【问题讨论】:

  • @ReinerCzerwinski 我不想让所有的白色像素都透明。只是构成背景的那些。不是前景中的白色像素
  • 反转阈值以遮盖中心的主要斑点,填充可能的孔(来自白色像素),使用此遮罩作为 Alpha 通道,可能在遮罩上进行一些高斯模糊以平滑轮廓。
  • 如您所见,-transparent 会影响图像中的所有像素,即使在冰淇淋内部也是如此。而是使用从左上角开始并在遇到非白色像素时停止的泛光填充 - 所以它只影响白色像素由其他白色像素连接到左上角...@ 987654336@ 您可能需要将magick 更改为convert 和/或alpha 更改为matte
  • 酷,请考虑支持并接受@fmw42 的回答,因为需要更多时间来解释对我建议的有用改进。只需单击投票记录旁边的空心勾号(复选标记),每个人都可以立即看到它是有效的正确答案,同时也让 Fred 的努力得到声望点奖励。谢谢。

标签: python node.js image opencv image-processing


【解决方案1】:

我将在 Mark Setchell 出色的 ImageMagick 答案中添加更多内容,即通过稍微模糊 Alpha 通道添加一些抗锯齿,然后将模糊值归零低于中灰色,从而使用模糊泛洪填充。这将平滑从模糊洪水填充留下的锯齿状边缘。请注意,太大的绒毛值会导致泄漏到您的冰淇淋中,因为冰淇淋的颜色与背景的颜色相似。太小的模糊值不会充分去除背景。所以这张图片中的fuzz值容差很紧。

输入:

对于 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


你需要下载结果才能看到背景是透明的,轮廓是平滑的。

【讨论】:

  • 在 macOS 上使用 ImageMagick 7.0.8-68 我得到“转换:不合格的绘图原语定义‘0’@error/draw.c/RenderMVGContent/4406”。有什么想法吗?
  • ImageMagick 7 使用魔法,而不是转换。只需将 convert 更改为 magick 并再次尝试该命令。如果fuzz值太大,则可以使整个图像透明。所以一定不要让它太大。还将遮罩更改为Alpha。 magick img.png -fuzz 2% -fill none -draw "alpha 0,0 floodfill" -channel alpha -blur 0x2 -level 50x100% +channel result.png
  • 感谢您的快速回复。不幸的是同样的错误。查看完整的错误和版本输出@gist.github.com/rynop/f8fce887780e5ac1d05a4027922fc74d
  • 抱歉,您发帖时我正在编辑命令。看我最后的cmets。试试这个:magick img.png -fuzz 2% -fill none -draw "alpha 0,0 floodfill" -channel alpha -blur 0x2 -level 50x100% +channel result.png
  • 工作 - 谢谢!输出仍然不如 www.remove.bg 好(边缘被撕裂/“粗糙”)。 fuzz 是为了获得更好的结果而进行调整的方法吗?知道 remove.bg 是如何在没有任何配置的情况下做得这么好的吗?
猜你喜欢
  • 2011-12-23
  • 2011-12-06
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
相关资源
最近更新 更多