Android 如何合并图像并相互施加影响

Android 如何合并图像并相互施加影响,android,image-processing,android-image,Android,Image Processing,Android Image,假设我在一些Framelayout中上传两张或两张以上的图片。在此,我上传了三张照片,同一个人在这三张照片的三个不同位置。然后,Android、java或Native中有哪些图像处理库可用于执行如图所示的操作 我想在对方身上加上多张照片 类似这样的:- 一个想法是: 对所有这些图片进行分层,在图片中找到不匹配的区域并合并它们 如何将多张图片与其他图片合并?通过检查di相似性和相互合并 是否有任何第三方Api或某些Photoshop服务可以帮助我进行此类图像处理?我不知道这是否符合您对“本地人”

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

我想在对方身上加上多张照片

类似这样的:-

一个想法是:

  • 对所有这些图片进行分层,在图片中找到不匹配的区域并合并它们
  • 如何将多张图片与其他图片合并?通过检查di相似性和相互合并


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

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

    如果库本身可以提供您想要的内容,那么根据您的体系结构,您可以设置一个小型ASP.NET站点在服务器上执行图像处理。

    检查接受的答案

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

    如果你不想使用openCV,只是想尝试一下你自己,那么你将不得不使用framlayout和three imageview。为用户提供选项,以便为所有三个图像选择要显示的图像的特定部分。因此,选定的部分将显示在选定的图像中。这样你就会得到上面所说的结果

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


    享受编码……:)

    您可以使用openCV覆盖图像,您可以在和或处进行检查

    或者您可以将其创建为

    或者你也可以像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();
        }
    
    }
    }
    

    在这种情况下,您不只是尝试组合图像。您确实希望在不同位置组合包含相同对象的场景

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

    在这种情况下,您可以执行以下操作:

  • 通过分析考虑多个图像时不变的像素,确定场景背景
  • 以输出图像作为背景开始
  • 对于每个图像,移除背景以获得所需对象,并将其与输出图像组合
  • 有一个插件可以执行此任务,称为MergePhoto。下面的程序使用该插件组合一组跑酷照片

    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();
    }
    }
    
    导入marvin.image.MarvinImage;
    导入marvin.io.MarvinImageIO;
    导入marvin.plugin.MarvinImagePlugin;
    导入marvin.util.MarvinPluginLoader;
    公共类应用程序{
    公共应用程序(){
    //1.将图像01.jpg、02.jpg、…、05.jpg加载到列表中
    列表图像=新的ArrayList();
    
    对于(int i=1;我已经试过OpenCV了。因为其他的图像是只包含那个人还是也包含背景?如果只是那个人,没有任何特殊的API很容易做到。如果不是,你需要一些特殊的东西…@androiddeveloper:其他图像也包含相同的背景。我需要找到图片之间的差异并合并它们。@Vikalpa我想最好是使用第三方库。但是,你可能可以了解它并自己实现。如果图像确实相似,你可能可以获得图像之间的某种平均背景,并找出其中的哪一部分是人物本身。完成这些任务后,你就回来了对于使用普通API的简单任务…请让我按照您的指导进行尝试。您理解问题的方式和重要的响应是ray的希望。如果您在运行示例或配置框架方面有任何问题,请在上发布消息。我使用单人坐在椅子上的照片尝试了您的解决方案在第二秒内,他站着。但结果图像模糊了,只是显示了站着的人的阴影,而不是人本身。我们需要对图像进行任何预处理或其他事情吗…要使其如上图所示工作…?答案很复杂,没有更多细节。在这种情况下,我建议你在堆栈上创建一个新的帖子溢出,链接此帖子,并提供输入图像和当前结果。如果可能,请使用标记“marvin framework”并在此处发布链接。
    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();
    }
    }