Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从图像中删除白色背景,并使用PHP使其透明_Php_Image Processing_Imagick - Fatal编程技术网

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

从图像中删除白色背景,并使用PHP使其透明,php,image-processing,imagick,Php,Image Processing,Imagick,我得到了这个代码: $im = new Imagick("test.jpg"); $im->paintTransparentImage($im->getImageBackgroundColor(), 0, 500); $im->setImageFormat('png'); $im->writeImage('finish.png'); 这就是结果(我手动添加了粉红色背景以更好地查看问题): 当我增加fuzz时,对象旁边会有更多的白色像素消失,但对象内部也会有更多的白色像

我得到了这个代码:

$im = new Imagick("test.jpg");
$im->paintTransparentImage($im->getImageBackgroundColor(), 0, 500);
$im->setImageFormat('png');
$im->writeImage('finish.png');
这就是结果(我手动添加了粉红色背景以更好地查看问题):

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

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

这很完美。有人知道怎么做吗

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

更新:

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()
添加
$im->despeckleimage()
$im->paintTransparentImage
之前,可以获得更好的效果:


唯一需要做的就是用白色像素填充小的空白区域。有什么方法可以做到这一点吗?

我使用GrabCut算法获得了一个即时解决方案。我将OpenCV 3与python结合使用,以获得所需的输出。不幸的是,我不知道
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
变量创建了一个黑色背景

这是我得到的

有关此算法和所用参数的详细信息,请访问。你也可以在彩色背景上进行掩蔽

我相信同样的方法也可以在
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()
这是对您对问题所做编辑的回应

以下是您上传的图像:

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

现在我执行了“形态闭合”操作,得到了以下结果:

最后,我用您在开始时上传的原始图像屏蔽了上面的图像,以获得以下信息:


第二种解决方案是最糟糕的,它只删除所有白色像素,第三种不是PHP。有人能告诉我使用PHP的解决方案吗?第一个解决方案也只删除100%的白色像素,你为什么还要回答我很抱歉我的问题。@AnneSchwarz第三个解决方案使用了什么html?你能编辑你的问题并添加进去吗?另外,您添加了什么代码来增加模糊度?您能用更相关的代码详细说明您的问题吗?“您使用了什么html来获得第三个解决方案?”什么?oO fuzz在代码中设置为500,看起来非常好。我会检查那里使用的算法,并在我可以使用的时候给出反馈。我刚刚更新了问题,请检查一下。也许你知道用白色像素填充小空白区域的解决方案?是的,知道了。将图像转换为二值图像(黑白),使粉红色变为黑色,裙子保持白色。现在执行形态关闭操作。完成!!!这看起来很有希望,但我现在和主持人有问题,我会尽快表演,并给出反馈:好的,我可以再试一次,开始时背景是黑色的吗?您能告诉我哪些值必须在:thresholdimage($threshold*\Imagick::getQuantum(),$channel)?您可以向背景添加任何颜色。我选择黑色是因为它与白色衣服形成对比。我为python代码选择的阈值是127。