我正在尝试以编程方式删除一些图像的白色背景并使之透明。图像的格式很简单,它具有白色背景和一个主要位于中间的对象。
我想复制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中帮助您找到适当的解决方案。
答案 0 :(得分:3)
我将为Mark Setchell出色的ImageMagick回答提供更多有关使用模糊泛光填充的信息,方法是通过稍微模糊alpha通道,然后将模糊值清零到中间灰度以下来添加一些抗锯齿。这将平滑模糊泛洪填充留下的锯齿状边缘。请注意,模糊值太大会导致冰淇淋泄漏,因为冰淇淋的颜色与背景颜色相似。模糊值太小将无法充分消除背景。因此,此图像中的模糊值公差很严格。
输入:
对于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
您需要下载结果以确保背景透明且轮廓光滑。