カメラのExifデータから撮影傾向を分析する~データ取得編

※当サイトはアフィリエイト広告を利用しています

データ分析

フォルダに格納されている複数の画像ファイル(RAWデータ、JPEGデータ)からExifデータを収集/分析します。撮影データのExif情報は個々の画像で確認するのは簡単ですが、複数の画像データから傾向を見るにはPythonなどツールの利用が必要です。

Exif(エグジフ:Exchangeable Image File Format)は、カメラで撮影した画像データに付与される撮影データやカメラ設定データなどの情報です。

今回Pythonを利用してフォルダ内の撮影画像からExifデータを取得します。

実際のExifデータの分析/可視化は下記記事を参照ください。

Exifデータの取得方法

Pythonの分析環境を構築していることを前提とします。

ExifToolの準備

下記URLからExifToolをダウンロードします。
https://exiftool.org/

特別にインストールなどは不要で、ZIPファイルを解凍して特定のフォルダに格納しておけばOKです。

Pythonを利用してExifデータを抽出

画像フォルダとExifToolのパスを指定します。

画像フォルダについては下層のフォルダに含まれる画像も再帰的に検索するようになっていますので、画像を保存しているフォルダのトップを指定すればOKです。

import os
import pandas as pd
import piexif
import subprocess
import json

# 画像の格納先フォルダを設定
folder_path = 'C:/Users/******/photodata'

# exiftoolの格納フォルダを指定
exiftool_path = 'C:/*********/exiftool/exiftool.exe'


# フォルダ内のすべての画像ファイルを再帰的に検索する関数
def find_images(folder):
    image_files = []
    for root, _, files in os.walk(folder):
        for file in files:
            if file.lower().endswith(('.jpg', '.jpeg', '.cr3')):
                image_files.append(os.path.join(root, file))
    return image_files

# JPEGファイルのEXIF情報を取得する関数
def get_exif_from_jpeg(file_path):
    try:
        exif_dict = piexif.load(file_path)
        return exif_dict['Exif']
    except Exception as e:
        print(f"Error reading EXIF from {file_path}: {e}")
        return {}

# CR3ファイルのEXIF情報を取得する関数
def get_exif_from_cr3(file_path):
    try:
        result = subprocess.run([exiftool_path, '-j', file_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        
        if result.returncode != 0:
            print(f"Error reading EXIF from {file_path}: {result.stderr.decode('utf-8')}")
            return {}

        exif_data = json.loads(result.stdout.decode('utf-8'))[0]  # JSONデータとして読み取る
        return exif_data
    except Exception as e:
        print(f"Error reading EXIF from {file_path}: {e}")
        return {}

# EXIF情報を抽出してデータフレームとして一覧化する関数
def extract_exif_info(folder):
    image_files = find_images(folder)
    exif_data_list = []

    for image_file in image_files:
        if image_file.lower().endswith(('.jpg', '.jpeg')):
            exif_data = get_exif_from_jpeg(image_file)
        elif image_file.lower().endswith('.cr3'):
            exif_data = get_exif_from_cr3(image_file)
        else:
            continue
        
        # ファイル名とパスもデータに追加
        exif_data['File Name'] = os.path.basename(image_file)
        exif_data['File Path'] = image_file
        
        exif_data_list.append(exif_data)

    # データフレームに変換
    df = pd.DataFrame(exif_data_list)
    return df

私の使っているカメラはCANONですのでキヤノンのRAWファイルである「.CR3」とJPEGデータを分析対象にしています。

コードの実行

画像1枚1枚にアクセスするため非常に時間がかかります。パソコンの電源をつけて一晩放置するくらいがちょうどよいです。

# メイン処理
folder = folder_path

# EXIF情報をデータフレーム形式で取得
exif_df = extract_exif_info(folder)

# CSVで保存
exif_df.to_csv("exif_data.csv", index=False)

ExifデータをCSV形式で保存することができます。.CR3ファイルの場合、400列以上のカラムが生成されます。

次の分析編でこれらのデータの加工、可視化を進めていきます。

この記事を読んだ人がよく見ています

タイトルとURLをコピーしました