【发布时间】:2020-01-13 02:40:58
【问题描述】:
我正在尝试以编程方式删除少数图像的白色背景并使其透明。图像的格式很简单,它有一个白色的背景和一个主要位于中间的对象。
我想复制https://remove.bg 网站的功能,使图像的背景透明。
我曾尝试使用sharp 或imageMagick 软件使背景透明。但它也使主要对象内部的一些像素变得透明。我绝对不想要。
在imageMagik 中使用以下代码将白色背景转换为透明
convert brownie.jpg -transparent white brownie.png
convert cakebig.jpg -fuzz 1% -transparent white cakebig.png
似乎并不完美。
运行命令后,图像确实变得透明了,但主要对象内的一些像素也受到了影响。
输入图像
ImageMagik 的输出(查看主要对象内的某些像素如何变得透明)
来自https://remove.bg 的预期输出(看不到对主对象的影响)
这似乎是一个图像处理问题,似乎OpenCV 是解决此问题的最佳解决方案。我对图书馆不太了解,所以有点棘手。正在检查一些代码,遇到了可用于图像分割的grab cut 和graph cut 算法。但我对此并不完全确定。请在 OpenCV 中帮助解决这个问题。
【问题讨论】:
-
@ReinerCzerwinski 我不想让所有的白色像素都透明。只是构成背景的那些。不是前景中的白色像素
-
反转阈值以遮盖中心的主要斑点,填充可能的孔(来自白色像素),使用此遮罩作为 Alpha 通道,可能在遮罩上进行一些高斯模糊以平滑轮廓。
-
如您所见,
-transparent会影响图像中的所有像素,即使在冰淇淋内部也是如此。而是使用从左上角开始并在遇到非白色像素时停止的泛光填充 - 所以它只影响白色像素由其他白色像素连接到左上角...@ 987654336@ 您可能需要将magick更改为convert和/或alpha更改为matte。 -
酷,请考虑支持并接受@fmw42 的回答,因为需要更多时间来解释对我建议的有用改进。只需单击投票记录旁边的空心勾号(复选标记),每个人都可以立即看到它是有效的正确答案,同时也让 Fred 的努力得到声望点奖励。谢谢。
标签: python node.js image opencv image-processing