【问题标题】:how to merge Images and impose on each other如何合并图像并相互施加
【发布时间】:2013-08-20 08:31:42
【问题描述】:

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

我想将多张图片叠加在一起。

类似这样的:-

一个想法是:

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

如何将多张图片与其他图片合并?通过检查异同并相互合并?

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

【问题讨论】:

  • 你试过 OpenCV。对于e.g.
  • 其他图片是只包括那个人,还是包括背景?如果只是那个家伙,不用任何特殊的 API 也很容易做到。如果没有,你需要一些特别的东西......
  • @androiddeveloper :其他图像也包括相同的背景。我需要找到图片之间的差异并将它们合并。
  • @VikalpPatel 好吧,我想最好为此使用第三方库。但是,您也许可以了解它并自己实现它。如果图像确实相似,您可能能够将背景作为图像之间的某种平均值,并找出其中的哪一部分是那个人本身。完成这些任务后,您将回到使用普通 API 的简单任务...

标签: android image-processing android-image


【解决方案1】:

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

因此,它不仅仅是一个简单的组合或 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();
}
}

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

【讨论】:

  • 让我按照您的指导尝试一下。你对问题的理解和重大响应的方式真的是雷的希望。
  • 如果您在运行示例或配置框架时遇到任何问题,请在discussion group 留言。
  • 我尝试了您的解决方案,其中一个人坐在椅子上,第二个人站着。但是结果图像很模糊,它只是显示站立的人而不是人自己的阴影。我们是否需要对图像或其他东西进行任何预处理......使其如上图所示工作......?
  • 没有更多细节就很难回答。在这种情况下,我建议您在 Stackoverflow 上创建一个新帖子,链接该帖子,并提供输入图像和当前结果。如果可能,请使用标签“marvin-framework”并在此处发布链接。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    检查接受的答案here

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

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

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

    享受编码... :)

    【讨论】:

      【解决方案4】:

      您可以使用 openCV 覆盖图像,您可以在 OpenCVherehere 上查看

      // 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);
      

      或者您可以将其创建为watermark effect

      或者你可以在java中试试merging two images

      尝试使用这个类

      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();
          }
      
      }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-09-18
        • 1970-01-01
        • 1970-01-01
        • 2012-03-04
        • 1970-01-01
        • 2022-01-25
        • 1970-01-01
        • 1970-01-01
        • 2012-09-25
        相关资源
        最近更新 更多