被写界深度合成に挑戦

これは[Infocom Advent Calendar 2024](https://qiita.com/advent-calendar/2024/infocom) 21日目の記事です。

# 被写界深度合成に挑戦

デジカメを使った被写界深度合成にMacで挑戦してみました。

こんな流れで手順を説明します。

- 被写界深度合成とは？
- パナソニックのデジカメでフォーカスセレクト撮影
- 撮影した画像(mpeg4)からFFmpegを使って各フレームの画像を取得
- Affinity Photoのフォーカス結合機能を使って深度合成画像を生成

# 被写界深度合成とは？

被写界深度合成は、写真や画像の技術の一つです。
複数の写真を合成して、よりくっきりとした画像を作り出します。
特に、被写体全体にピントが合っている写真を作りたいときに使われます。

以下の写真はテーブルの上に模型を並べて撮影したサンプルです。
手前のスズキ・カナタにフォーカスが合っており、奥のドゥカティ・デスモセディチはぼやけています。
![s_P1070008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29418/617027a3-0b51-e8e2-99e8-58f02752f4c0.jpeg)

深度合成を行うとこのような写真になります。
![s_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29418/2af5d1cb-39af-2277-8602-f706e9ec2219.jpeg)

# パナソニックのデジカメでフォーカスセレクト撮影

私が所有するデジカメ（[DMC-TX1 ※生産終了](https://panasonic.jp/dc/c-db/products/DMC-TX1.html)）にはフォーカスセレクト機能があり、自動でフォーカスを変えながら撮影することができます。
※フォーカスセレクトは他機種にも搭載されています。しかも最新機種ではカメラ上で合成できる機種もあるようです。気になる方はメーカーのサイトをチェックしてみてください。
![s_IMG_2390.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29418/80e53120-856f-3a96-8dbc-90dc97ed1b26.jpeg)

撮影した後はカメラを操作して任意のフォーカス画像を取得することが可能です。
![s_IMG_2388.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29418/4b29593b-beee-a9ab-d476-8f231549f3de.jpeg)
![s_IMG_2389.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29418/dcca222d-1283-8e83-907c-e6382d0160ac.jpeg)

取得した後は後述する写真編集ソフトで合成します。しかし、一枚ずつ選択操作して保存するのは面倒です。
フォーカスセレクトで撮影した画像を確認したところ、mpeg4で保存されていました。
mpeg4から各フレームの画像を取得できれば面倒な操作から解放されそうです。

# 撮影した画像(mpeg4)からFFmpegを使って各フレームの画像を取得

ここからITっぽい話題になります。
[FFmpeg](https://www.ffmpeg.org)を使って各フレームの画像を取得します。
毎回コマンド実行は面倒臭いのでシェルスクリプトを組みます。
今回はFinderから実行したいので、拡張子は「.command」にします。
Finderから実行するとカレントパスがHomeになってしまいます。スクリプトにカレントパスへ移動する処理も追記しました。

```
#!/bin/zsh

# カレントパスに移動
cd `dirname $0`

ls

for file in *.MP4; do
  # ファイルが存在しない場合はスキップ
  [ -e "$file" ] || continue
  
  # ファイル名から拡張子を除去
  filename="${file%.*}"
  
  # ffmpegコマンドを実行
  ffmpeg -i "$file" "${filename}_%03d.png"
  
  echo "Processed: $file -> ${filename}_%03d.png"
done

read -p "Press any key."

```

スクリプトを実行します。
![s_スクリーンショット 2024-12-21 19.16.17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29418/6316cddc-c530-b204-e844-fe4cb68a52f4.jpeg)

無事に各フレームの画像を取得することができました。
このケースだと45枚の画像が出力されました。
![s_スクリーンショット 2024-12-21 16.47.55.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29418/44baa660-a9b8-55fb-069c-2d0158b50077.jpeg)

# Affinity Photoのフォーカス結合機能を使って深度合成画像を生成

出力された画像を結合します。
Photoshopでも対応できますが、私は[Affinity Photo](https://affinity.serif.com/ja-jp/photo/?srsltid=AfmBOoqjqGmtlalsPuGmcdoE3l58AfJp3HLRz4VvShnCjw0Q0-4v47vG)を使っています。

「新規フォーカス結合」メニューから出力画像をまとめて選択すると合成が始まります。
合成中の様子はこのように出力されます。
![s_スクリーンショット 2024-12-21 16.50.12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29418/12773178-bb02-d594-dee6-47d44c641546.jpeg)

あと少し・・・
![s_スクリーンショット 2024-12-21 16.50.16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29418/85935ca3-2455-2459-77b8-0309543b3f59.jpeg)

完成しました！
![s_スクリーンショット 2024-12-21 16.49.08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29418/68d03b40-3183-93cf-8008-83bbb6457233.jpeg)

# 出力サンプル

## その１
![s_P1070008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29418/39961c08-428c-4e12-0933-7ba8c38d8343.jpeg)

深度合成結果（45枚、ファイルサイズ合計583MB）
![s_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29418/a62d413b-7efa-f2f6-3338-5f762a270e66.jpeg)

## その２
![s_P1070011.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29418/e7493230-cf24-997d-51cd-740eebf491f7.jpeg)

深度合成結果（45枚、ファイルサイズ合計587MB）
構造物が重なっている場合でも綺麗に合成できています。
（アングルや各種条件によっては境界部分が滲むこともあります）
![s_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29418/3512518c-922e-aab9-6a6a-a6b31a17db9d.jpeg)

# 終わりに

今回のサンプルでは50枚程度の合成になりましたが、アングルによっては200枚近くの画像が生成されるケースもあります。ファイルサイズ合計も2GB程度になります。
私のMac（M1 MacBookAir 16GBメモリ）では特に問題ありませんが、メモリが少なめのPCを使っている場合は注意が必要かもしれません。

深度合成は写真の表現の幅が広がりますので、面白い手法と思います。