Как программно удалить фон изображения, сделав его прозрачным в рубине? - PullRequest
4 голосов
/ 13 марта 2012

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

enter image description here

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

Я использую ruby ​​на рельсах 3 и carrierwave в качестве обработчика загрузки.

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

Ответы [ 4 ]

4 голосов
/ 12 мая 2014

Для удаления белого фона с изображений ниже приведен скрипт bash с использованием 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

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


Источник: Преобразование белого в прозрачное

1 голос
/ 14 марта 2012

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

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

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

1 голос
/ 14 марта 2012

Взгляните на http://www.imagemagick.org/Usage/masking/#bg_remove

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

0 голосов
/ 01 мая 2013

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

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

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

OR

Закрытое решение для естественного матирования изображения

www.wisdom.weizmann.ac.il / ~ Левин / документы / Матирование-Левин-Lischinski-Weiss-CVPR06.pdf

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

...