Как объединить изображения и накладывать друг на друга

Предположим, что я загружаю два или более двух фото в некоторых Framelayout. Настоящим я загружаю три фото с одним и тем же человеком в трех разных положениях на всех этих трех картинках. Затем какие библиотеки обработки изображений в Android или Java или Native доступны для выполнения чего-либо, как показано на рисунке.

Я хотел бы наложить несколько изображений друг на друга.

Что-то вроде этого: -

Picture with layering facility

Одна из идей:

  • Сделайте несколько слоев во всех этих картинах и найдите несоответствующие области в фотографиях и объедините их.

Как можно объединить несколько изображений с другими? Проверяя ди-сходство и сливаясь друг с другом?

Есть ли какой-либо сторонний Api или какой-либо сервис Photoshop, который может помочь мне в этом виде обработки изображений?

Ответ 1

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

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

В этом случае вы можете:

  • Определить фон сцены, анализируя пиксели, которые не меняются с учетом нескольких изображений.
  • Начните с того, что выходное изображение является только фоном.
  • Для каждого изображения удалите фон, чтобы получить желаемый объект, и объедините его с выходным изображением.

Для выполнения этой задачи под названием MergePhoto используется Marvin. В приведенной ниже программе этот плагин используется для объединения набора паркурных фотографий.

import marvin.image.MarvinImage;
import marvin.io.MarvinImageIO;
import marvin.plugin.MarvinImagePlugin;
import marvin.util.MarvinPluginLoader;

public class MergePhotosApp {

public MergePhotosApp(){

    // 1. load images 01.jpg, 02.jpg, ..., 05.jpg into a List
    List<MarvinImage> images = new ArrayList<MarvinImage>();
    for(int i=1; i<=5; i++){
        images.add(MarvinImageIO.loadImage("./res/0"+i+".jpg"));
    }

    // 2. Load plug-in and process the image
    MarvinImagePlugin merge = MarvinPluginLoader.loadImagePlugin("org.marvinproject.image.combine.mergePhotos");
    merge.setAttribute("threshold", 38);

    // 3. Process the image list and save the output
    MarvinImage output = images.get(0).clone();
    merge.process(images, output);
    MarvinImageIO.saveImage(output, "./res/merge_output.jpg");
}

public static void main(String[] args) {
    new MergePhotosApp();
}
}

Входные изображения и выходное изображение показаны ниже.

enter image description here

Ответ 2

Я не знаю, будет ли это соответствовать вашему определению "туземцев", но есть следующая библиотека .NET, которая могла бы помочь: http://dynamicimage.apphb.com/

Если сама библиотека может дать вам нужную вам информацию, тогда в зависимости от вашей архитектуры вы можете настроить небольшой сайт ASP.NET для обработки изображений на сервере.

Ответ 3

Проверьте принятый ответ здесь.

В приведенной выше ссылке происходит слияние двух изображений, которое выполняется openCV sdk.

Если вы не хотите использовать openCV и просто хотите попробовать самостоятельно, вам придется немного поиграть с framlayout и с тремя изображениями. Дайте возможность пользователю выбрать определенную часть изображения для показа всех трех изображений. Таким образом, выбранная часть будет показана на выбранном изображении. на этом пути вы получите результат, как указано выше, что вы сказали.

Надеюсь, вы поняли мою мысль. Если нет, то дайте мне знать.

Наслаждайтесь кодированием...:)

Ответ 4

Вы можете накладывать изображения с помощью openCV, вы можете проверить OpenCV и здесь или здесь

// Read the main background image
cv::Mat image= cv::imread("Background.png");
// Read the mans character image to be placed
cv::Mat character= cv::imread("character.png");
// define where you want to place the image
cv::Mat newImage;
//The 10,10 are the initial coordinates in pixels
newImage= image(cv::Rect(10,10,character.cols,character.rows));
// add it to the background, The 1 is the aplha values
cv::addWeighted(newImage,1,character,1,0,newImage);
// show result
cv::namedWindow("with character");
cv::imshow("with character",image);
//Write Image
cv::imwrite("output.png", newImage);

или вы можете создать его как эффект водяных знаков

Или вы можете попробовать его в java, как слияние двух изображений

попробуйте использовать этот класс

public class MergeImages {

public static void main(String[] args) {
    File inner = new File("Inner.png");
    File outter = new File("Outter.png");

    try {

        BufferedImage biInner = ImageIO.read(inner);
        BufferedImage biOutter = ImageIO.read(outter);

        System.out.println(biInner);
        System.out.println(biOutter);

        Graphics2D g = biOutter.createGraphics();
        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8f));
        int x = (biOutter.getWidth() - biInner.getWidth()) / 2;
        int y = (biOutter.getHeight() - biInner.getHeight()) / 2;
        System.out.println(x + "x" + y);
        g.drawImage(biInner, x, y, null);
        g.dispose();

        ImageIO.write(biOutter, "PNG", new File("Outter.png"));
    } catch (Exception e) {
        e.printStackTrace();
    }

}
}