Удалите белый фон с изображения и сделайте его прозрачным с помощью PHP

Я получил этот код:

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

И это результат (я добавил вручную розовый фон, чтобы увидеть проблемы лучше):

введите описание изображения здесь

Когда я увеличиваю fuzz тогда более белые пиксели исчезают рядом с объектом, но затем более белые пиксели также исчезают внутри объекта.

Я попробовал одно и то же изображение на веб-сайте, и результат:

введите описание изображения здесь

Это довольно хорошо. Кто-нибудь знает, как это сделать?

Если кому-то понадобится исходное изображение для тестирования:

введите описание изображения здесь

ОБНОВИТЬ:

Добавление $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 . Надеюсь это поможет 🙂

РЕДАКТИРОВАТЬ:

Это в ответ на редактирование, сделанное вами на вопрос.

Следующее было изображение, загруженное вами:

введите описание изображения здесь

Я применил порог и получил следующее изображение:

введите описание изображения здесь

Теперь я выполнил операцию «морфологическое закрытие» и получил следующее:

введите описание изображения здесь

Наконец, я замаскировал изображение выше с исходным изображением, которое вы загрузили в начале, чтобы получить это:

введите описание изображения здесь