如何合并图像并相互施加
Posted
技术标签:
【中文标题】如何合并图像并相互施加【英文标题】:how to merge Images and impose on each other 【发布时间】:2013-08-20 08:31:42 【问题描述】:假设我在某些Framelayout
中上传两张或两张以上的照片。在此,我将在所有这三张照片中上传三张同一个人在三个不同位置的照片。那么 android 或 java 或 Native 中的哪些图像处理库可用于执行如图所示的操作。
我想将多张图片叠加在一起。
类似这样的:-
一个想法是:
-
在所有这些图片中进行一些分层,并在图片中找到不匹配的区域并将它们合并。
如何将多张图片与其他图片合并?通过检查异同并相互合并?
是否有任何第三方 API 或一些 Photoshop 服务可以帮助我进行这些图像处理?
【问题讨论】:
你试过 OpenCV。对于e.g. 其他图片是只包括那个人,还是包括背景?如果只是那个家伙,不用任何特殊的 API 也很容易做到。如果没有,你需要一些特别的东西...... @androiddeveloper :其他图像也包括相同的背景。我需要找到图片之间的差异并将它们合并。 @VikalpPatel 好吧,我想最好为此使用第三方库。但是,您也许可以了解它并自己实现它。如果图像确实相似,您可能能够将背景作为图像之间的某种平均值,并找出其中的哪一部分是那个人本身。完成这些任务后,您将回到使用普通 API 的简单任务... 【参考方案1】:在这种情况下,您不只是尝试组合图像。你真的很想组合一个包含不同位置的相同对象的场景。
因此,它不仅仅是一个简单的组合或 alpha 组合,其中输出图像中给定像素的颜色是每个图像中该像素的值的总和除以图像的数量。
在这种情况下,您可以这样做:
-
确定场景背景,分析考虑多张图像时不会发生变化的像素。
从仅作为背景的输出图像开始。
对于每个图像,移除背景以获得所需的对象并将其与输出图像组合。
有一个名为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 留言。 我尝试了您的解决方案,其中一个人坐在椅子上,第二个人站着。但是结果图像很模糊,它只是显示站立的人而不是人自己的阴影。我们是否需要对图像或其他东西进行任何预处理......使其如上图所示工作......? 没有更多细节就很难回答。在这种情况下,我建议您在 *** 上创建一个新帖子,链接该帖子,并提供输入图像和当前结果。如果可能,请使用标签“marvin-framework”并在此处发布链接。【参考方案2】:我不知道这是否符合您对“本地人”的定义,但以下 .NET 库可以提供帮助:http://dynamicimage.apphb.com/
如果库本身可以满足您的需求,那么根据您的架构,您可以设置一个小型 ASP.NET 站点来在服务器上进行图像处理。
【讨论】:
【参考方案3】:检查接受的答案here。
在上面的链接中有两个图像的合并,这是由 openCV sdk 完成的。
如果您不想使用 openCV 而只是想自己尝试一下,那么您将不得不很少使用 framlayout 和三个 imageview。为用户提供选项以选择图像的特定部分以显示所有三个图像。因此,所选部分将显示为所选图像。这样你就会得到上面所说的结果。
希望你明白我的意思。如果没有,请告诉我。
享受编码... :)
【讨论】:
【参考方案4】:您可以使用 openCV 覆盖图像,您可以在 OpenCV 和 here 或 here 上查看
// 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();
【讨论】:
以上是关于如何合并图像并相互施加的主要内容,如果未能解决你的问题,请参考以下文章