12

一部の に 2 枚以上の写真をアップロードしているとしFramelayoutます。ここに、同じ人物が 3 枚の写真すべてで 3 つの異なる位置にある 3 枚の写真をアップロードします。次に、写真に示すように、Android、Java、またはネイティブの画像処理ライブラリを使用して何かを実行できます。

複数の写真を互いに押し付けたいと思います。

これらのようなもの:-

レイヤー機能付きの写真

1つのアイデアは次のとおりです。

  1. これらすべての写真でレイヤーを作成し、写真の不一致領域を見つけてマージします。

複数の画像を他の画像とマージするにはどうすればよいですか? 相違点をチェックして、互いにマージしますか?

これらのちょっとした画像処理を行うのに役立つサードパーティの Api または Photoshop サービスはありますか?

4

4 に答える 4

8

この場合、画像を結合しようとしているだけではありません。異なる位置にある同じオブジェクトを含むシーンを結合したい場合。

したがって、出力画像の特定のピクセルの色が、各画像のこのピクセルの値の合計を画像の数で割ったものであるという単純な組み合わせやアルファ合成ではありません。

この場合、次のようにします。

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

入力画像と出力画像を以下に示します。

ここに画像の説明を入力

于 2013-10-15T18:35:07.587 に答える
0

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

または、透かし効果として作成することもできます

または、 2 つの画像をマージするように 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();
    }

}
}
于 2013-08-28T11:14:10.730 に答える
0

これがあなたの「ネイティブ」の定義に当てはまるかどうかはわかりませんが、役立つ次の .NET ライブラリがあります: http://dynamicimage.apphb.com/

ライブラリ自体が必要なものを提供できる場合は、アーキテクチャに応じて、サーバー上で画像操作を行う小さな ASP.NET サイトをセットアップできます。

于 2013-08-27T22:51:33.080 に答える
0

ここで受け入れられた回答を確認してください。

上記のリンクでは、openCV sdk によって行われる 2 つのイメージのマージがあります。

openCV を使用せず、自分で試してみたい場合は、framlayout と 3 つの imageview で少し遊ぶ必要があります。3 つの画像すべてに対して表示する画像の特定の部分を選択するオプションをユーザーに提供します。そのため、選択した画像の選択した部分が表示されます。このようにして、あなたが言ったことのような結果が得られます。

あなたが私の主張を理解してくれることを願っています。そうでない場合は、お知らせください。

コーディングを楽しんでください... :)

于 2013-08-28T07:08:59.313 に答える