如何合并图像并相互施加

时间:2013-08-18 11:37:00

标签: android image-processing android-image

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

我想互相拍多张照片。

像这样: -

Picture with layering facility

一个想法是:

  1. 在所有这些图片中进行一些分层,并在图片中找到不匹配的区域并合并它们。
  2. 如何将多张图片与其他图片合并?通过检查di-similarity并相互合并?

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

4 个答案:

答案 0 :(得分:7)

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

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

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

  1. 确定分析考虑多个图像时不会改变的像素的场景背景。
  2. 从输出图像开始只是背景。
  3. 对于每个图像,删除背景以获取所需对象并将其与输出图像组合。
  4. 有一个Marvin插件可以执行此任务,称为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();
    }
    }
    

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

    enter image description here

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

检查已接受的答案here

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

如果您不想使用openCV并且只想尝试自己,那么您将不得不使用framlayout和三个imageview进行游戏。为用户提供选项以选择图像的特定部分以显示所有三个图像。因此,将显示所选图像的所选部分。通过这种方式,你可以得到上面所说的结果。

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

享受编码......:)

答案 3 :(得分:0)

您可以使用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

或者你可以在像merging two images

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

}
}