【コラム】少ない写真でもモザイクアートとして成立する?── 配置エンジンの裏側、ちょっとだけお見せします

モザイクアートって、見たことありますか? 小さな写真を何百、何千と集めて並べると、遠くから見ると1枚の大きな絵になるっていう、あれです。結婚式のウェルカムボードや卒業記念品、企業の周年イベントなんかでよく使われていますよね。

で、いざ「自分たちも作ろう!」となったとき、実はひとつ、けっこう根本的な問題にぶち当たります。

そもそも写真が、全然足りない。

今回はそんな困った。。。についてのコラムです。もちろんお写真がたくさんある場合は良いのですが、お写真が少ないからって諦めることはない。というお話です。

MOSAIC LIVEでは200枚のお写真からのご依頼も多数受付けており、ご満足のいくアートに仕上げさせていただいております。

では・・・

考えてみてください。80×45マスのモザイクアートを作るには、タイルが3,600枚必要です。でも、お客様からいただける写真って、だいたい200枚くらい。割り算するまでもなく「足りてないな」とわかりますよね。1枚あたり平均18回は登場していただくことになります。

「ランダムに並べちゃえば気にならないでしょ?」── そう思いますよね。私たちも最初はそう思いました。でも残念ながら、人間の目って想像以上に鋭いんです。同じ写真が横にズラッと並んでたり、縦にポツポツ揃ってたり、斜めに規則的なラインができてたりすると、すぐバレます。もう、一瞬で「あ、なんか繰り返してる」って気づかれちゃうんですよ。

で、これをなんとかしたいということで、MOSAIC LIVEではTerminusの配置最適化エンジンを開発しました。要するに「少ない写真でも、繰り返してる感が出ないように賢く並べてくれるやつ」です。せっかくなので、その仕組みをちょっとだけお見せします。


ステップ1:インターリーブ配置 ── 同じ写真をできるだけ遠ざける

いちばん単純な方法は、写真をシャッフルして並べて、足りなくなったらまたシャッフルして追加する、というやり方。でもこれ、繋ぎ目でどうしても事故が起きます。1周目の最後と2周目の最初で、運悪く同じ写真が連続しちゃうんです。

1周目: [C, A, D, B]
2周目: [D, B, A, C]
つなげると: [C, A, D, B, D, B, A, C]
                       ↑ ここ!Dが連続してしまう

「まあ確率の問題だし…」と目をつぶりたくなりますが、3,600タイルもあると、こういう事故がそこかしこで発生します。さすがに無視はできません。

そこで採用したのが、インターリーブ(交互配置)という手法。複数ラウンドの配列をそのまま横に連結するのではなく、縦方向に読み出すことで、同じ写真の出現間隔をグッと広げます。

1周目: [C, A, D, B]
2周目: [D, B, A, C]
3周目: [A, D, C, B]

縦方向に読み出し → C, D, A, A, B, D, D, A, C, B, C, B

200枚の素材なら、だいたい200タイルごとにしか同じ写真が現れない計算。この時点で、ざっくり見たときの「あ、また同じ写真だ」感はかなり抑えられます。


ステップ2:クールダウン再配置 ── 「またこの写真が」を防ぐ

インターリーブでおおまかな間隔は確保できましたが、シャッフルの気まぐれで、局所的に「あれ?さっきもこの写真見たぞ?」ということはまだ起こりえます。

ここで登場するのが、クールダウン付き再配列。考え方は超シンプルで、「直近k個に使った写真は、次の候補から外す」というルールです。要するに、出番が終わったばかりの写真には「ちょっと休んでてね」と伝えるわけです。

このkの値は素材数から勝手に決まります。写真が少なければkは小さめ(じゃないと誰も選べなくなっちゃうので)、多ければkは大きめにして間隔をしっかり確保。つまり、素材の状況に合わせた”ちょうどいい”制御を自動でやってくれるわけです。

この処理を通すことで、1次元の並び順において、同じ写真が最低でもk個以上の距離を保った状態が保証されます。ここまでくると、けっこう安心感があります。


ステップ3:2Dグリッド近接チェック ── 最後の”落とし穴”を埋める

さて、ステップ1と2で「1列に並んだときの重複感」はかなり解消できました。でも、モザイクアートって最終的には2次元のグリッド(表)に並べるんですよね。ここに、もうひとつ意外な落とし穴があります。

たとえば80列のグリッドで考えてみてください。1次元の配列で80個離れたふたつの写真は、2次元に展開すると真上と真下の関係です。81個離れていれば斜め隣。つまり、1次元上では「十分離してるよ!」と思っていても、折り返した途端にお隣さんになってしまう可能性があるんです。

というわけで、MOSAIC LIVEの配置エンジンでは、Terminusの専用サーバ上で2次元行列としての近接チェックを実行します。「ただ並べ替える」だけでは到達できない品質を、ここで担保しています。

近接判定は2段階構成です。

① ライン方向チェック(縦・横・斜め)

人間の目が最も敏感に反応するのは、同一直線上に揃ったパターンです。「こっから右にずらっと同じ写真」とか「斜め下にポツポツ同じ顔」とか。それを検出するために、各セルから水平・垂直・対角線の4方向に沿って一定距離を走査し、同一画像がないかチェックします。

        ↑
    \  |  /
      \|/
  ← ── ● ── →
      /|\
    /  |  \
        ↓

チェック距離はキャンバスサイズから自動計算。80列のグリッドなら、各方向8タイル先まで目を光らせます。

② エリア近接チェック(矩形範囲)

直線だけじゃ捉えきれない「L字型」とか「1マスずれた斜め配置」みたいな、ちょっとイジワルなパターンもあります。なので、各セルの周囲を矩形範囲で追加チェックする処理も仕込んでいます。

重複が見つかったセルは、グリッド内の別のセルとスワップ(交換)するのですが、交換先でも新たな重複が発生しないことを確認してから実施します。「直したのに別のところが壊れた」なんて悲しいことにならないように、ちゃんと二重検証。ここは手を抜きません。

さらに、走査の順序もランダム。おかげで、固定的なブロック分割だと見逃しがちな境界付近の重複も自然に拾えます。


まとめ:3段階の最適化パイプライン

ステップやっていることどんな効果?
インターリーブ巨視的に分散させる同じ写真の出現間隔を最大化
クールダウン局所的にコントロールご近所での「またこの写真か」を防止
グリッド近接排除2次元で仕上げる縦・横・斜めの視認パターンを消去

3つのステップは前の段階の出力をさらに磨き上げるように積層されていて、ひとつのアルゴリズムだけでは難しい配置品質を実現しています。

そして(ここが地味に便利なポイントなのですが)、すべてのパラメータは素材数とグリッドサイズから自動で決まるので、制作者が何かを手動で調整する必要は一切ありません。写真をポンと渡していただければ、あとはTerminusの配置エンジンが「いい感じ」に仕上げます。

「200枚しか写真がないんですけど、3,600タイルのモザイクアート、作れますか?」

── 作れます。しかも、繰り返しが見えないものを。

興味を持っていただけたら、ぜひお気軽にお問い合わせください。「どこまで少ない写真でいけるの?」みたいな素朴な疑問でも大歓迎です。