ドローンなどのツールを使用して撮影した画像には、位置情報や動きといったメタデータがしばしば含まれます。しかし画像を加工するとこれらのメタデータが失われることがあります。これが原因でメタデータを前提としたソフトウェアで加工後の画像が利用できない事態に陥ることもあります。そこでこの記事では、ある画像からメタデータを取得し、別の画像に再度埋め込む方法をPythonのソースコードを用いて紹介します。
今回扱うメタデータはExifとXMPの二種類です。Exif (Exchangeable image file format)はデジタルカメラやスマートフォンで撮影された画像にメタデータを埋め込むための標準規格で、カメラのモデルや撮影日時、シャッタースピード、露出、GPS情報などの情報が含まれます。一方、XMP (Extensible Metadata Platform)はAdobeが開発したメタデータ規格で、XML形式で記述されます。XMPはExifよりも自由度が高く、様々なデータを埋め込むことが可能です。
ExifやXMPのメタデータは、Pythonのライブラリであるpyexiv2を使用することで簡単に扱うことができます。以下のコマンドでpyexiv2をインストール可能です。
LeoHsiao1/pyexiv2: Read/Write metadata(including EXIF, IPTC, XMP), comment and ICC Profile embedded in digital images.
pyexiv2 · PyPI
pip install pyexiv2
そしてpyexiv2を使用して一つの画像から別の画像へメタデータをコピーする方法は以下の通りです。
import pyexiv2
# Exif のコピー
src_img = pyexiv2.Image('meta/SRC_20230524092243_0004_T.JPG')
dist_img = pyexiv2.Image('meta/dist_with_exif.jpg')
# コピー元のExifをコピー先に適用
dist_img.modify_exif(src_img.read_exif())
# XMP のコピー
src_img = pyexiv2.Image('meta/SRC_20230524092243_0004_T.JPG')
dist_img = pyexiv2.Image('meta/dist_with_xmp.jpg')
# コピー元のXMPをコピー先に適用
dist_img.modify_xmp(src_img.read_xmp())
このようにpyexiv2を使用してメタデータをコピーすることで、画像の加工後でもメタデータを保持し、さまざまな用途に適用することが可能です。
pyexiv2ではPythonの辞書型としてメタデータを扱っています。これにより各メタデータの扱いが容易になっています。以下にその例を示します。
import pyexiv2
from pprint import pprint
# pyexivの画像オブジェクトを用意
dist_img = pyexiv2.Image('meta/dist_with_xmp.jpg')
# xmp の内容をコンソールに表示 pprint は Python 組み込みの目視しやすい形で値を表示する関数です
pprint(dist_img.read_xmp())
"""
表示例
{'Xmp.crs.AlreadyApplied': 'False',
...省略...
'Xmp.xmp.CreateDate': '2023-05-24 09:22:43',
'Xmp.xmp.ModifyDate': '2023-05-24 09:22:43'}
"""
# xmp を読み込み
xmp = dist_img.read_xmp()
# 辞書の一つのデータを書き換え
xmp['Xmp.xmp.CreateDate'] = '3000-01-01 10:00:00'
# 書き換え結果を保存
dist_img.modify_xmp(xmp)
# 改めて表示
pprint(dist_img.read_xmp())
"""
表示例
{'Xmp.crs.AlreadyApplied': 'False',
...省略...
'Xmp.xmp.CreateDate': '3000-01-01 10:00:00',
'Xmp.xmp.ModifyDate': '2023-05-24 09:22:43'}
"""
以上のようにPythonを使ってExifやXMPなどのメタデータを操作することができ、この方法はで画像加工後もメタデータを保持したままソフトウェアに適切な形で画像を提供することが可能になります。