Как убрать «зеленый экран» портретного фона - PullRequest
9 голосов
/ 11 мая 2010

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

Мои собственные попытки были ... ну ... менее успешными.

Я ищу любые подсказки или решения или документы по этому вопросу. Коммерческие решения тоже хороши.

И прежде чем вы прокомментируете и скажете, что это невозможно сделать автоматически: нет, это не так. На самом деле существует компания, которая предлагает именно эту услугу, и если мне не удастся найти другое решение, мы собираемся использовать их. Проблема в том, что они охраняют свой алгоритм своей жизнью и поэтому не продают / не лицензируют свое программное обеспечение. Вместо этого мы должны отправить все изображения по FTP, где выполняется обработка, и затем мы отправим результат обратно домой. (И нет, на Филиппинах у них нет скрытого персонала, который обрабатывает это вручную, поскольку мы говорим несколько тысяч снимков в день ...) Однако этот подход ограничивает его полезность для некоторые причины. Поэтому я бы очень хотел найти решение, в котором это можно было бы сделать мгновенно, не подключаясь к Интернету.

РЕДАКТИРОВАТЬ : Мои "портреты" изображают людей, у которых есть волосы - что действительно сложно, поскольку зеленый фон будет сливаться с волосами. Другой сложный момент, если есть возможность расстоять между зеленью на заднем плане и той же зеленью в одежде людей. Компания, о которой я говорю выше, утверждает, что они могут сделать это, выяснив, находится ли зеленая область в фокусе (резкость против размытости).

Ответы [ 5 ]

18 голосов
/ 16 декабря 2016

Поскольку вы не предоставили ни одного изображения, я выбрал одно из Интернета с цветным ключом с различными оттенками зеленого и значительным уровнем шума из-за сжатия JPEG .

Технологической спецификации не существует, поэтому я использовал Java и Marvin Framework .

входное изображение:

enter image description here

Шаг 1 просто преобразует зеленые пиксели в прозрачность. В основном он использует правило фильтрации в цветовом пространстве HSV.

enter image description here

Как вы упомянули, волосы и некоторые граничные пиксели представляют цвета, смешанные с зеленым. Чтобы уменьшить эту проблему, на шаге 2 эти пиксели фильтруются и уравновешиваются для уменьшения его зеленой пропорции.

перед:

enter image description here

после

enter image description here

Наконец, на шаге 3 градиентная прозрачность применяется ко всем граничным пикселям. Результат будет еще лучше с высоким качеством изображения.

конечный результат:

enter image description here

Исходный код:

import static marvin.MarvinPluginCollection.*;

public class ChromaToTransparency {

    public ChromaToTransparency(){
        MarvinImage image = MarvinImageIO.loadImage("./res/person_chroma.jpg");
        MarvinImage imageOut = new MarvinImage(image.getWidth(), image.getHeight());
        // 1. Convert green to transparency
        greenToTransparency(image, imageOut);
        MarvinImageIO.saveImage(imageOut, "./res/person_chroma_out1.png");
        // 2. Reduce remaining green pixels
        reduceGreen(imageOut);
        MarvinImageIO.saveImage(imageOut, "./res/person_chroma_out2.png");
        // 3. Apply alpha to the boundary
        alphaBoundary(imageOut, 6);
        MarvinImageIO.saveImage(imageOut, "./res/person_chroma_out3.png");

    }

    private void greenToTransparency(MarvinImage imageIn, MarvinImage imageOut){
        for(int y=0; y<imageIn.getHeight(); y++){
            for(int x=0; x<imageIn.getWidth(); x++){

                int color = imageIn.getIntColor(x, y);
                int r = imageIn.getIntComponent0(x, y);
                int g = imageIn.getIntComponent1(x, y);
                int b = imageIn.getIntComponent2(x, y);

                double[] hsv = MarvinColorModelConverter.rgbToHsv(new int[]{color});

                if(hsv[0] >= 60 && hsv[0] <= 130 && hsv[1] >= 0.4 && hsv[2] >= 0.3){
                    imageOut.setIntColor(x, y, 0, 127, 127, 127);
                }
                else{
                    imageOut.setIntColor(x, y, color);
                }

            }
        }
    }

    private void reduceGreen(MarvinImage image){
        for(int y=0; y<image.getHeight(); y++){
            for(int x=0; x<image.getWidth(); x++){
                int r = image.getIntComponent0(x, y);
                int g = image.getIntComponent1(x, y);
                int b = image.getIntComponent2(x, y);
                int color = image.getIntColor(x, y);
                double[] hsv = MarvinColorModelConverter.rgbToHsv(new int[]{color});

                if(hsv[0] >= 60 && hsv[0] <= 130 && hsv[1] >= 0.15 && hsv[2] > 0.15){
                    if((r*b) !=0 && (g*g) / (r*b) >= 1.5){
                        image.setIntColor(x, y, 255, (int)(r*1.4), (int)g, (int)(b*1.4));
                    } else{
                        image.setIntColor(x, y, 255, (int)(r*1.2), g, (int)(b*1.2));
                    }
                }
            }
        }
    }

    public static void main(String[] args) {
        new ChromaToTransparency();
    }
}
3 голосов
/ 11 мая 2010

Если вы знаете «зеленый цвет», вы можете написать небольшую программу на opencv C / C ++ / Python, чтобы извлечь этот цвет и заменить его прозрачными пикселями.

2 голосов
/ 12 ноября 2011

123 Video Magic Green Screen Background Software и есть еще несколько программ для удаления зеленого фона экрана, надеюсь, это поможет

2 голосов
/ 11 мая 2010

Взгляните на эту тему: http://www.wizards -toolkit.org / дискурс-сервер / viewtopic.php? Е = 2 & т = 14394 & начать = 0

и ссылка в нем на учебник по адресу: http://tech.natemurray.com/2007/12/convert-white-to-transparent.html

Тогда нужно просто написать несколько скриптов, чтобы просмотреть каталог, полный изображений. Довольно просто.

1 голос
/ 11 мая 2010

PaintShop Pro позволяет удалять фоны на основе выбора цвета. У них также есть палочка для удаления фона, которая удалит все, к чему вы прикоснулись (преобразовав эти пиксели в прозрачные). Вы можете настроить «толерантность» для палочки так, чтобы она отбирала пиксели, похожие на те, к которым вы прикоснулись. В прошлом это работало очень хорошо для меня.

Чтобы автоматизировать это, вы должны запрограммировать скрипт на PSP , который делает то, что вы хотите, а затем вызвать его из вашей программы. Это может быть хитрый способ сделать автоматическую замену, но это будет самое дешевое и быстрое решение без необходимости писать кучу кодов для C # / C ++ или платить коммерческим агентствам.

Говорят, вы платите за то, что получаете.

...