12

假设我要上传两张或两张以上的照片Framelayout。在此,我将在所有这三张照片中上传三张同一个人在三个不同位置的照片。然后,Android、java 或 Native 中的哪些图像处理库可用于执行如图所示的操作。

我想将多张图片相互叠加。

像这样的东西: -

带有分层功能的图片

一个想法是:

  1. 在所有这些图片中进行一些分层,并在图片中找到不匹配的区域并将它们合并。

如何将多张图片与其他图片合并?通过检查二相似性并相互合并?

是否有任何第三方 Api 或一些 Photoshop 服务可以帮助我进行这些图像处理?

4

4 回答 4

8

在这种情况下,您不只是尝试组合图像。你真的想组合一个包含不同位置的相同对象的场景。

因此,它不仅仅是简单的组合或 alpha 组合,其中输出图像中给定像素的颜色是每个图像中该像素的值的总和除以图像的数量。

在这种情况下,您可能会这样做:

  1. 确定场景背景,分析考虑到多个图像而不会改变的像素。
  2. 从输出图像开始作为背景。
  3. 对于每个图像,移除背景以获得所需的对象并将其与输出图像组合。

有一个名为 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();
}
}

输入图像和输出图像如下所示。

在此处输入图像描述

于 2013-10-15T18:35:07.587 回答
0

您可以使用 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();
    }

}
}
于 2013-08-28T11:14:10.730 回答
0

在此处检查接受的答案。

在上面的链接中有两个图像的合并,这是由 openCV sdk 完成的。

如果您不想使用 openCV 并且只想尝试自己,那么您将不得不很少使用 framlayout 和三个 imageview。为用户提供选项以选择图像的特定部分以显示所有三个图像。因此,所选部分将显示为所选图像。这样,您将获得上述结果。

希望你明白我的意思。如果没有,请告诉我。

享受编码... :)

于 2013-08-28T07:08:59.313 回答
0

我不知道这是否符合您对“本地人”的定义,但有以下 .NET 库可以提供帮助:http ://dynamicimage.apphb.com/

如果库本身可以满足您的需求,那么根据您的体系结构,您可以设置一个小型 ASP.NET 站点来在服务器上进行图像处理。

于 2013-08-27T22:51:33.080 回答