从图像中删除白色背景并使用 PHP 使其透明

Remove white background from the image and make it transparent using PHP

我得到了这个代码来做到这一点:

$im = new Imagick("test.jpg");
$im->paintTransparentImage($im->getImageBackgroundColor(), 0, 500);
$im->setImageFormat('png');
$im->writeImage('finish.png');

这是结果(我手动添加了粉红色背景以更好地查看问题):

当我增加 fuzz 时,对象旁边会消失更多的白色像素,但对象内部也会有更多的白色像素消失。

我在网站上尝试了相同的图片,结果是:

非常完美。有人知道该怎么做吗?

如果有人需要原始图像进行测试:

更新:

$im->paintTransparentImage前加$im->despeckleimage();效果更好:

唯一需要做的就是用白色像素填充小的空白区域。有什么办法吗?

我使用 GrabCut 算法 获得了即时解决方案。我使用带有 python 的 OpenCV 3 来获得所需的输出。不幸的是,我不知道 php 也不知道 imagik

代码:

import numpy as np
import cv2

img = cv2.imread('Dress.jpg',1)
cv2..imshow('Original image',img)
mask = np.zeros(img.shape[:2],np.uint8)

bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)

rect = (60,20,325,503)

cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
nimg = img*mask2[:,:,np.newaxis]

cv2.imshow("Extracted image",nimg)

cv2.waitKey()
cv2.destroyAllWindows()

我首先使用 mask 变量创建了一个黑色背景。

这是我得到的

访问 THIS PAGE 了解此算法和使用的参数的详细信息。您也可以在彩色背景上进行遮罩。

我相信 imagik 也可以尝试同样的方法。希望这有帮助:)

编辑:

这是对您对问题所做编辑的回应。

以下是您上传的图片:

我应用了阈值并获得了以下图像:

现在我进行了'morphological closing'操作,得到了这个:

最后我用你一开始上传的原图蒙版上面的图得到这个: