抹茶アイス

好きなことを書くブログ

Processingで多重露出

Processingでなんちゃって多重露出をやってみた

Processingで多重露出してるブログを読んで、面白かったのでやってみました。
海月姫の月海ちゃんの部屋にタコクラゲのクララを合成してみました。写真は下手なのに、なんというファンタジー。世界観がぴったりです。(気のせい?)

多重露出について

多重露出とは

1枚の写真の中に複数の写真を埋め込む手法のことです。

E-PL7で多重露光を撮るには

  • MENU>撮影メニュー2>多重露出 から撮影出来ます。
  • コマ数:「2コマ」のみ選択可能。
  • 自動ゲイン補正:「on」にすると自動で明るさを調整してくれます。「off」だと2枚分の明るさになってしまいます。
  • 再生画+多重:「on」にすると撮影してあったRAW形式の画像を重ねて多重露出が出来ます。3コマ以上合成したい時は、これを繰り返します。

Processingで多重露出の詳細

f:id:matcha-ice-cream:20150525203245p:plain

説明

E-PL7でも多重露出は撮れますし、RAWで撮っておけば後で合成も出来ますが、RAWで撮ってなかったしソフトも持ってないので、今回は適当にProcessingで。2つプログラムを作ってみました。合成写真作るの楽しかったです。今度はもっとちゃんとした多重露出をやってみたいです。
左はコード1で。2枚の画像を合成しています。1枚目の画像に、透明度は少なめで少しだけピンク色で2枚目の画像を重ねています。
右はコード2で。3枚の画像を合成しています。1枚目の画像に、2枚目の画像と3枚目の画像(2枚目の画像をひっくり返したもの)を合成率を変えて重ねています。3枚目の画像はもう少し濃くしても良かったかな?

コード1

コード1の概要
  • tintで楽チン多重露出。
  • 色を乗せたり、透明度を変更します。
  • ファンタジー度が高くなりますが、プログラムを変えることで何枚でも重ねられます。
コード1のプログラム
PImage img1, img2;
void setup() {
  img1 = loadImage("xxxx.JPG");
  img2 = loadImage("xxxx.JPG");
  size(img1.width/5, img1.height/5);
}
void draw() {
  image(img1, 0, 0, width, height);
  tint(252, 229, 250, 50);
  image(img2, 0, 0, width, height);
}

コード2

コード2の概要
  • 何枚でも多重露出出来ます。
  • 枚数に合わせて露出(明るさ)を自動で調整します。
  • 画像ごとに合成率を変えることも出来ます。
コード2のプログラム
int imgNum = 3;
PImage[] imgs = new PImage[imgNum];
PImage after_img;
float[] f = new float[imgNum]; /* synthetic ratio */

void setup() {
  for (int i = 0; i < imgs.length; i++) {
    imgs[i] = loadImage("P" + i + ".JPG");
    f[i] = 1.0/imgNum;
  }
  after_img = createImage(imgs[0].width, imgs[0].height, RGB);
  size(after_img.width, after_img.height);
  /* customize synthetic ratio */
  //f[0] = 1.0; f[1] = 0.7; f[2] = 0.2;
  noLoop();
}

void draw() {
  composite();
  image(after_img, 0, 0, width, height);
}

void composite(){
  after_img.loadPixels();
  for(int y = 0; y < after_img.height; y++){
    for(int x = 0; x < after_img.width; x++){
      int[] pos = new int[imgNum];
      color[] c = new color[imgNum];
      float r = 0.0, g = 0.0, b = 0.0;
      float fSum = 0.0;
      for (int i = 0; i < imgNum; i++) {
        pos[i] = x + y*imgs[i].width;
        c[i] = imgs[i].pixels[pos[i]];
        r += red(c[i])  *f[i];
        g += green(c[i])*f[i];
        b += blue(c[i]) *f[i];
        fSum += f[i];
      }
      after_img.pixels[pos[0]] = color(r/fSum, g/fSum, b/fSum);
    }
  }
  after_img.updatePixels();
}

参考

海月姫(1)

海月姫(1)

デザイン言語 Processing入門 - 楽しく学ぶコンピュテーショナルデザイン

デザイン言語 Processing入門 - 楽しく学ぶコンピュテーショナルデザイン