如何合并图片并相互强加

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

我想在彼此之间强加多张照片。

像这样的东西: –

图片与分层设施

一个想法是:

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

如何合并多个图片与其他? 通过检查di-similarity并相互融合?

有没有任何第三方的Api或一些Photoshop服务可以帮助我做这些image processing?

Solutions Collecting From Web of "如何合并图片并相互强加"

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

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

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

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

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

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

在这里输入图像说明

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

如果库本身可以让你想要你想要的,那么根据你的架构,你可以build立一个小型的ASP.NET网站,在服务器上进行image processing。

在这里检查接受的答案。

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

如果你不想使用openCV,只想尝试一下你自己,那么你将不得不与framlayout和三个imageview玩。 给用户selectselect图像的特定部分来显示所有三个图像。 所选的部分将显示所选的图像。 这样你就会得到如上所述的结果。

希望你明白了我的观点。 如果没有,那么让我知道。

享受编码… 🙂

你可以使用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); 

或者您可以创build它作为水印效果

或者你可以尝试在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(); } } }