カメラによるフィルム写真のデジタル化


昔撮ったフィルムが結構あるのですが、カメラを使って比較的手軽にデジタル化する方法があるという事で試してみる事にしました。しかもRAWで残せるため、とにかくスキャンするだけして後から必要に応じてJPEG化するという事もできそうです。

昔フィルムスキャナを使っていたのですがRAW現像に対応しておらず、1枚1枚補正してTIFFやJPEGにするものだったため大変面倒で時間がかかり、カメラによる方法が効率良さそうならこれで一気にデジタル化できそうです。

Nikon コピーアダプタ ES-2

ネットではES-1を使用する方法が割と紹介されていますが、ES-2を買うとフィルムのカセットが付属しています。ES-1に比べるとかなり割高でしたが、フィルムスキャナを買うよりも安いのと、効率よくやりたかったのでこっちにしました。

構成

色々試行錯誤はあったのですが、最終的な構成はこうなりました。

tkp_31BA24QfWk.png

それなりの長さになってしまうため三脚に付けて作業するとちょっと不安です。机の上に置いたらちょうど良く置けたのでこれで作業する事にしました。

光源としてLEDライトを使います。

tkp_bqWtHl.jpg

接写リング

tkp_HZXAGAH3XL.png

レンズのカメラ側を嵩上げするツールです。Amazonで5000円ぐらいで売ってますが、不安な人は1万しますがKenko製を買うと良いです。

これを使う事で仕様以上に寄ってもピントが合う代わりに遠くのものにピントが合わなくなります。

ちなみに安物はたまにブラックアウトしたりするらしいです。

付属延長チューブ

ES-2自体は52mm径です。3cmほど延長するチューブが付いていますが、こちらを取り付けるとカメラ側は62mm径となってしまいます。

私が使ったレンズは52mmのため、これを62mmにする必要があるためアップリングを使います。後々使い回しが聞くようにアップリングのセットを買い、52→55→58→62と3段で口径を広げてチューブに接続しました。

撮影倍率・位置

画面の四隅はピントが甘くなる事があるので、下の画像のように真ん中周辺のみを使うことにしました。絞っても良いのですが小絞りボケが出てしまうのでF5.6で撮影しています。画素が少し無駄になる気もしますがフルHD以上の解像度は得られるので良いかなぁ…。

また、方眼の罫線を表示して調整する事で斜めになる事を防ぎます。

tkp_hJhiHM3Wd.png

私の場合AFが使えたので、ピントはAFに任せます。

また、この状況で機械式シャッターを使う必要性を感じなかったので自分は電子シャッター(静音モード)を使って撮影しました。

スキャン補助ツール

手元にHDMIキャプチャがあったのでそこでキャプチャした画面の色を反転した上でガイド(青い四角)を表示するツールを作りました。ちなみにネガはオレンジベースがあるので単純反転しただけでは正しい色になりませんが、色温度を2000ぐらいに設定するとそれなりに見える色になるようです。

tkp_AjWNGSMpObmr.png

この青い四角の中にコマが来るようにして撮影すれば大きくズレるのを防げそうです。Python+OpenCVで作成しました。

#!/usr/bin/python3
# -*- codinf:utf8 -*-

# 参考
# https://qiita.com/str32/items/3dda077713095df850c8

import cv2
import numpy as np

# 設定
# 四角形のサイズを定義する。x_rate=0.55,y_rate=0.65とすれば画像縦サイズの55%
# 横サイズの65%の四角形を中心に表示する。オフセットは今は無い。
x_rate = 0.55
y_rate = 0.65

# VideoCapture オブジェクトを取得します
# 引数の数字はビデオデバイス(/dev/videoXのX)
capture = cv2.VideoCapture(2)

while(True):
    ret, cap = capture.read()

    # 反転
    cap = 255 - cap

    # 画面サイズを求める
    cap_size_x = cap.shape[1]
    cap_size_y = cap.shape[0] 

    # 四角形のサイズを計算する
    sq_size_x = int(cap_size_x * x_rate)
    sq_size_y = int(cap_size_y * y_rate)

    sq_pos_x = int( (cap_size_x-sq_size_x)/2 )
    sq_pos_y = int( (cap_size_y-sq_size_y)/2 )

    sq_end_pos_x = sq_pos_x + sq_size_x
    sq_end_pos_y = sq_pos_y + sq_size_y

    cv2.rectangle(cap, (sq_pos_x, sq_pos_y), (sq_end_pos_x, sq_end_pos_y), (255, 0, 0), thickness=4)
    out = cap
    cv2.imshow('If quit, push Q key.',out)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

capture.release()
cv2.destroyAllWindows()