3

У меня есть куча изображений продуктов, и я хотел бы удалить фон каждого программно в рубине. Вот некоторые example images Я положил на imgur.Как программно удалить фон изображения, делая его прозрачным в рубине?

enter image description here

Я помещу пример один здесь как раз, так что вы можете видеть, но я не хочу, чтобы отправить кучу изображений. Это самый простой из них. У этого есть только белый фон, но некоторые из продуктов имеют более сложные фоны. Я знаю, что делать что-то вроде этого на this image, вероятно, не будет работать, поэтому я хотел бы понять это и изящно изгнать, не удаляя фон и как-то не уведомляя меня.

Я использую ruby ​​on rails 3 и carrierwave как мой обработчик загрузки.

Возможно ли это, или я действительно смогу удалить белые фоны?

+0

Если предполагаемый результат этого вопроса является академическое обсуждение эвристического анализа цвета, я рекомендую следующие ответы. Если это так, как вы это делаете? Ознакомьтесь с поставщиком SaaS Imagga (http://imagga.com/api/docs/smart-cropping-collage-slicing.html), который предлагает эту точную функциональность. –

+0

Google также «Фоновая горелка», которая предлагает API JSON для удаления изображений. – wbharding

ответ

1

Посмотрите на http://www.imagemagick.org/Usage/masking/#bg_remove

Вы, вероятно, можно сделать достаточно хорошо с твердым цветом фоном, но нетвердые фоны (как один в изображении, что вы связаны с) довольно трудно, и я сомневаюсь, что вы сможете придумать один метод, который будет работать для всех изображений.

+0

Я не смог получить rmagick, чтобы на самом деле это сделать. – hadees

1

ImageMagick является наиболее вероятным решением здесь (возможно, с мини-магическим камнем для рельсов), но, как вы полагаете, маловероятно, что в некоторых случаях у вас будет хороший результат. Простое превращение всех белых пикселей в прозрачные, скорее всего, оставит рваные края, которые будут совершенно очевидны на небелом фоне. Но есть удивительное количество опций, которые дают вам много контроля, который может быть у вас в PhotoShop или другом, - вы создадите маску, которая найдет контур фигуры в пределах определенного допуска оттенка, цвета или тому подобного , чем изменение всех соответствующих пикселей на прозрачный. Я думаю, вам также придется изменить формат PNG, так как я не верю, что JPEG поддерживает альфа-прозрачность.

CarrierWave - это подходящий инструмент для такого рода обработки - вы можете использовать его возможности для хранения исходного файла и сделать несколько автоматических попыток с использованием разных параметров (которые будут сохранять разные файлы, не касаясь оригинала) ,

http://www.imagemagick.org/Usage/masking/#two_background может дать вам начало.

+0

Как насчет того, будет ли изображение работать или нет? Это моя другая забота. Я не хочу делать это на изображении, который не будет впечатляюще. – hadees

+0

Без известного набора изображений (т. Е. Все имеют белые фоны) проблема, хотя, вероятно, и это возможно, не стоит усилий - человек мог бы выбрать лучший вариант за мгновение. Поэтому рассмотрите возможность использования Amazon Mechanical Turk, имеющего API, для представления версий изображений реальным людям, позволяя им выбрать лучший вариант. Посмотрите MTurk - это блестяще для этой проблемы. –

-1

Предполагая, что вы хотите обработать кучу несвязанных файлов. Насколько я понимаю, вы не можете, так как удаление фона (потянув матовую) - это серьезная недооцененная проблема и обязательно требует ввода пользователем. Постоянный цвет фона, такой как синий или зеленый экран, позволит вам неплохо работать с бесплатными программами, такими как gimp, но ничто не может сделать отличную работу, если вы не хотите читать перекрестные научные журналы, например,

Пуассон матирование

http://research.microsoft.com/apps/pubs/default.aspx?id=69117

ИЛИ

замкнутой форме решение матирования естественный образ

www.wisdom.weizmann.ac.il/~levina/papers/Matting-Levin -Lischinski-Weiss-CVPR06.pdf

Более поздний язык имеет код в формате MATLAB для учебных целей.Но это все серьезные кредиторы и могут использовать все ваши системные ресурсы в больших файлах, как это может быть установлено из пробной версии pullmatt-приложения от http://PixelFeather.com/download. Что, кстати, делает лучшую работу для проблемы естественного изображения любого проприетарного программного обеспечения, включая фотошоп.

+1

Хотя это хороший ответ о том, какие программы использовать для работы - вопрос подсказывает, как это сделать * программно *; ваш ответ, к сожалению, не предусматривает этого. – Jesse

+0

Да справедливый комментарий. Когда я читаю оригинальную запись, я не думаю, что хадисы обязательно собирались обрабатывать серию несвязанных изображений и на самом деле заканчивали, спрашивая, можно ли это сделать только с изображениями на белом фоне. т.е. изображения, связанные с их белым фоном. Также пакетная обработка явно была моей предпосылкой и даже не упоминалась. Я предполагал, что для обработки несвязанных изображений пакетная обработка будет очень сложной (невозможно). – user2337920

4

Для удаления белый фон из изображений, следующее Баш скрипт с помощью ImageMagick:

#!/bin/bash 

# pass the image path, image name and threshold(used as a fuzz factor) to the bash script 
IMGPATH=$1 
IMGNAME=$2 
THRESHOLD=$3 

# start real 
convert ${IMGPATH}${IMGNAME} \(+clone -fx 'p{0,0}' \) -compose Difference -composite -modulate 100,0 +matte ${IMGPATH}${IMGNAME}_difference.png 

# remove the black, replace with transparency 
convert ${IMGPATH}${IMGNAME}_difference.png -bordercolor white -border 1x1 -matte -fill none -fuzz 7% -draw 'matte 1,1 floodfill' -shave 1x1 ${IMGPATH}${IMGNAME}_removed_black.png 
composite -compose Dst_Over -tile pattern:checkerboard ${IMGPATH}${IMGNAME}_removed_black.png ${IMGPATH}${IMGNAME}_removed_black_check.png 

# create the matte 
convert ${IMGPATH}${IMGNAME}_removed_black.png -channel matte -separate +matte ${IMGPATH}${IMGNAME}_matte.png 

# negate the colors 
convert ${IMGPATH}${IMGNAME}_matte.png -negate -blur 0x1 ${IMGPATH}${IMGNAME}_matte-negated.png 

# eroding matte(to remove remaining white border pixels from clipped foreground) 
convert ${IMGPATH}${IMGNAME}_matte.png -morphology Erode Diamond ${IMGPATH}${IMGNAME}_erode_matte.png 

# you are going for: white interior, black exterior 
composite -compose CopyOpacity ${IMGPATH}${IMGNAME}_erode_matte.png ${IMGPATH}${IMGNAME} ${IMGPATH}${IMGNAME}_finished.png 

#remove white border pixels 
convert ${IMGPATH}${IMGNAME}_finished.png -bordercolor white -border 1x1 -matte -fill none -fuzz ${THRESHOLD}% -draw 'matte 1,1 floodfill' -shave 1x1 ${IMGPATH}${IMGNAME}_final.png 

#deleting extra files 
rm ${IMGPATH}${IMGNAME}_difference.png 
rm ${IMGPATH}${IMGNAME}_removed_black.png 
rm ${IMGPATH}${IMGNAME}_removed_black_check.png 
rm ${IMGPATH}${IMGNAME}_matte.png 
rm ${IMGPATH}${IMGNAME}_matte-negated.png 
rm ${IMGPATH}${IMGNAME}_finished.png 

я столкнулся с проблемой удаления белой каймой пикселей из полученного изображения. Проблема в создании бинарной маски и бритье оставшихся пикселей решает эту проблему.


Источник: convert white to transparent

+0

Это выглядит действительно многообещающим решением проблемы, которая у меня есть. Однако при попытке использовать этот скрипт я сталкиваюсь с следующей проблемой. «Несоответствующее рисование примитивного определения« матовый »@ ошибка/draw.c/DrawImage/3269 '. Любая идея, что может вызвать это? Использование Mac и ImageMagick 7.0.5-0 Q16 x86_64 –

+0

Попробуйте дважды проверить свои одиночные/двойные кавычки. Посмотрите, подходит ли этот ответ: http://stackoverflow.com/a/8701126/2175224 – jahackbeth

+1

Спасибо за ваш комментарий! Я пробовал это, но не работал и не был проблемой. Тем не менее, я где-то читал, что синтаксис для этого скрипта довольно старый, а матовый, похоже, заменен на альфа (?). Поэтому, когда я изменил «матовую заливку 1,1» на «альфа-1,1 заливку», это сработало! Большое спасибо за скрипт, работает как прелесть после некоторой настройки для моего варианта использования! –

Смежные вопросы