ImageMagick の例 --
レンズ補正

目次
ImageMagick の例 はじめに & 目次
レンズ補正の概要
非スケーリング拘束
定義済みパラメータセット
キャリブレーション
キーボードの例 (El-Supremo 氏提供)
 
レンズ歪みの補正 (PDF)
写真の撮影時に生成される画像は、レンズ効果と球面透視効果の両方によって歪んでいます。写真を適切に使用するには、通常、これらの効果を補正する必要があります。このセクションでは、その方法について説明します。このページの大部分は Wolfgang Hugemann 氏によって寄稿されました。

レンズ補正の概要

魚眼レンズや低価格の広角レンズ (または短焦点に設定されたズームレンズ) は、通常、顕著な樽型歪みを生成します。ただし、この歪みは、デジタル写真に適切なアルゴリズム変換を適用することで、ほとんど補正できます。Panorama Tools によって導入され、PTlens で使用されている、最も使用されているレンズ補正アルゴリズムの1つは、ImageMagick でも 樽型補正歪みメソッド として提供されています。この問題へのアプローチでは、歪みは4つの変換パラメータ `a、b、c、d` によって制御されます。特定のレンズ (または特定の焦点距離に設定されたズームカメラ) によって生成される歪みを補正するために、これらのパラメータには適切な値を選択する必要があります。適切な値を見つけることは、試行錯誤では困難です。以下では、さまざまなオペレーティングシステムで利用可能な Panorama Tools のフリーのグラフィカルユーザーインターフェースである Hugin を使用して、このモデルのレンズ補正パラメータを効果的に決定する方法について説明します。レンズ補正の詳細を扱いたくない場合は、このページの残りの部分をスキップして、PTlens を購入するだけで済みます。PTlens は、膨大な数のデジタルカメラとレンズに対して、洗練されたレンズ補正をリーズナブルな価格で提供しています (大規模なレンズデータベースを使用)。今日では、一部のデジタルカメラ (Nikon P7000 など) は、内部画像処理手順にレンズ補正を組み込んでいます。この機能を提供していないカメラで撮影した写真の場合、ImageMagick を使用すると、より大きな画像処理スクリプトの1つのステップとしてレンズ補正を統合できます。以下のテキストは、論文 レンズ歪みの補正 (PDF) (事故再構成におけるアプリケーションを扱っている) の要約版です。ここで示す説明は、適切なレンズ補正パラメータを取得する方法に焦点を当てた、より実践的なアプローチです。

非スケーリング拘束

樽型歪み で説明されているように、樽型歪みは次の数式で定義されます。
  R = ( a * r^3  +  b * r^2  +  c * r  +  d ) * r
ここで、`r` はデジタル写真の幾何学的画像中心までの距離、`R` は元の画像の同等の半径です。このようなマッピングでは常に、上記の式は一種の「カラー検索関数」、つまり半径 `r` のピクセルの色をどこで探すかを定義します。半径 `r` と `R` は、小さい方の画像寸法の半分 (つまり、通常は画像の高さ) で正規化されるため、画像の上端と下端の中点では `r = R = 1` になります。デジタル写真を補正する場合、非スケーリング拘束に注意を払う必要があります
  a + b + c + d = 1
これは明らかに `r` = 1 の場合に `R` = 1 を与えます。Panorama Tools は、他のパラメータによってパラメータ `d` を次のように計算します
  d = 1 - a - b - c
3つの自由なモデルパラメータが残されているため、パラメータ `d` は通常省略されます。ImageMagick は、省略されている場合、非スケーリング拘束によって `d` を自動的に計算します。そのため、レンズ補正の一般的な ImageMagick コマンドラインは次のようになります
  magick input.jpg -distort barrel '0.06335 -0.18432 -0.13008' output.jpg
`d` の計算は ImageMagick に任せます。ここで説明している Panorama Tools のレンズ補正方法は、レンズの光軸と画像の中心が同一であることを前提としていますが、実際には (製造公差のため) 厳密にはそうではありません。さらに、口ひげ歪み などの影響は無視されます。それにもかかわらず、実際には驚くほど正確に機能するようです。[グラフ]曲線 (`a = 0.05、b = -0.25、c = 0.05`) で示されているように、この関係は通常 0 から 1.5 (アスペクト比 3:2) の範囲で使用され、点 (0,0) と (1,1) を通過し、`r > 1` の場合は減少しなければなりません。

定義済みパラメータセット

PTlens の現在のレンズデータベースは、プログラムの「髄」であり、暗号化されているため、PTlens 自体によってのみ読み取ることができます。ただし、2006年2月までは、PTlens のデータベースは XML 形式、つまり簡単に編集できるテキスト形式でコード化されていました。PTlens の XML データベースのこの2006年バージョンは、Hugin の SourceForge Web サイト で (合法的に) 入手でき、多くの古いカメラモデルのデータを提供しています。PTlens のデータベースが暗号化されたとき、Hugin の作成者は代替として無料の XML コード化レンズデータベースを確立しようとしました。このデータベースは LensFun と呼ばれ、ダウンロードできます。完全なプログラミングインターフェースが付属していますが、基本的に必要なのは XML ファイルにあるカメラの情報だけです。例として、かつて人気があった Nikon Coolpix 995 のレンズ補正パラメータは、ディレクトリ `\data\db` にあるファイル `compact-nikon.xml` にあります。このファイルは、テキストエディターまたは XML ビューアーを使用して調べることができます

  <lens>
    <maker>Nikon</maker>
    <model>Standard</model>
    <mount>nikon995</mount>
    <cropfactor>4.843</cropfactor>
    <calibration>
      <distortion model="ptlens" focal="8.2" a="0" b="-0.019966" c="0" />
      <distortion model="ptlens" focal="10.1" a="0" b="-0.010931" c="0" />
      <distortion model="ptlens" focal="13.6" a="0" b="-0.002049" c="0" />
      <distortion model="ptlens" focal="18.4" a="0" b="0.003845" c="0" />
      <distortion model="ptlens" focal="23.4" a="0" b="0.006884" c="0" />
      <distortion model="ptlens" focal="28.3" a="0" b="0.008666" c="0" />
      <distortion model="ptlens" focal="31" a="0" b="0.009298" c="0" />
    </calibration>
  </lens>
カメラの技術データシートからわかるように、Nikon Coolpix 995 のズーム範囲は 8.2 ~ 31.0 mm で、35 mm フィルムカメラの場合は 38 ~ 152 mm に相当します。これは、152 / 31 = 4.90 のクロップファクターを与え、これは XML ファイルに示されている 4.843 とほぼ一致します。樽型歪みによる補正の係数は、8.2 mm、10.1 mm、13.6 mm、18.4 mm、23.4 mm、28.3 mm、31.0 mm の6つの焦点距離に対して提供されます。このレンズの場合、係数 `a` と `c` はゼロに設定されています。つまり、歪みは2次項 `b` のみによって記述されます。多くのレンズでは、`a` および `c` パラメータの値も使用されることに注意してください。これらの値も同様の方法で補間する必要があります。最短焦点距離に設定された Nikon Coolpix 995 で撮影した写真 `DSCN0001.jpg` がある場合、この写真は ImageMagick によって次のように補正できます

   magick DSCN0001.jpg -distort barrel '0.0 -0.019966 0.0' DSCN0001_pt.jpg
(ファイル名拡張子 `_pt` は、補正された画像をマークするために PTlens によって使用されます。) 提供されている6つの焦点距離について、補正係数 `b` は XML ファイルから読み取ることができます。他の焦点距離については、適切な値は2つの隣接する焦点距離の間の補間によって決定できます。あるいは、焦点距離 `f` に対する `b` の依存性は、多項式によって近似できます
  b = 0.000005142 * f^3 - 0.000380839 * f^2 + 0.009606325 * f - 0.075316854
そのため、最初に焦点距離 (EXIF 情報から読み取られる) を使用してレンズ補正パラメータ `b` を計算し、次に2番目のステップで、この値を `b` パラメータとして使用してレンズ補正 (つまり、樽型歪み) を実行します。Windows セクションには、上記の式を使用した VBScript の例 が示されています。焦点距離は `magick identify` を介して Nikon Coolpix 995 の写真から抽出されます。

ゼロからのキャリブレーション

基本的なアプローチ

レンズパラメータを決定する場合、すべてのプログラムは同じパラダイムに依存しています。理想的な透視マッピングは、現実世界の直線を画像内の直線にマッピングする必要があります。したがって、現実世界の点の集合 P0、P1、...、Pn が直線上にあることがわかっている場合、それらの画像 p0、p1、...、pn も直線上に配置される必要があります。この規則からの逸脱は、レンズの歪みに起因する必要があります。直線を定義する2つのパラメータ (たとえば、傾きと y 軸との交点) を決定するには、2つの点が必要です。追加される各ポイントは、レンズ補正パラメータを決定するための別の式を提供します。したがって、関数的アプローチに自由パラメータ `b` が1つしかない場合 (上記の Nikon Coolpix 995 の場合)、求められるレンズ補正パラメータ `b` を決定するには、現実世界の直線とその画像上に少なくとも3つの点を指定する必要があります。より具体的に言うと、歪みモデルはパラメータ `b` のみを使用します。つまり、補正された画像の座標 `X1、Y1` は、デジタル写真の座標から次のように計算できます。
r = s * sqrt(x1^2 + y1^2)
X1 = [(1-b) + b r^2] * x1
Y1 = [(1-b) + b r^2] * y1
Y1 = k1 * X1 + k2
これにより、同じ直線上にある各点に対して1つの式が得られます
[(1-b) + b r^2] * y1 = k1 * [(1-b) + b r^2] * x1 + k2

with: r = s * sqrt(x1^2 + y1^2)
したがって、3つの現実世界の点とそれに対応する画像点があれば、直線とレンズの歪み `k1、k2、b` を記述するパラメータを決定するのに十分です。実際には、現実世界の点の座標がわかることはめったにないため、求められるパラメータを決定するには3つ以上の点が必要です。ほとんどのキャリブレーションソフトウェアは、一連の方程式を生成するために直線の長方形グリッド (多くの場合、チェッカーボード) を使用し、非線形最小二乗法によってマッピングパラメータを計算します。一部のプログラムは、多くの場合定義済みのテンプレートを使用して、制御点のセットを独自に生成します。他のプログラムでは、ユーザーがキャリブレーション画像から制御点を選択する必要があります。

Hugin を使用したレンズパラメータセットの決定

以下では、Hugin を使用してレンズ補正パラメータのセットを決定する方法を示します。Hugin の Web サイトには既製の「シンプルなレンズキャリブレーションチュートリアル」がありますが、この記事の執筆時点 (2014 年) では、後で多数の補正に使用できる信頼できるパラメータを提供するにはシンプルすぎるようです。まず、適切なテストパターンを入手する必要があります。ISO 216 A3 などに印刷された、約 10 × 7 の正方形のチェッカーボードパターンで十分であり、よく使用されます。ただし、低コストのズームレンズ (いわゆる バリフォーカルレンズ) は、キャリブレーション中は無限遠に焦点を合わせる必要があります。これは、実際の焦点距離が近距離焦点の EXIF に埋め込まれている焦点距離と大きく異なる場合があるためです。固定焦点レンズの場合、チェッカーボードテストパターンを使用することもできます。これは、魚眼レンズのキャリブレーション時に特にお勧めです。視野をカバーするのに十分な大きさの現実世界のオブジェクトを見つけるのが難しい場合があるためです。そのため、特にズームレンズ / ズームカメラのキャリブレーションを行う場合は、PTlens の Web サイト で提案されているように、現代の建物の写真を撮る方がよいでしょう。そこに記載されている指示に従ってください。写真は遠透視歪みを示している場合があります
[IM Output]
パースペクティブ
[IM Output]
非パースペクティブ
Hugin を起動し、最初のタブの「画像を追加...」ボタンをクリックして、キャリブレーション画像を開きます。(Hugin のインターフェースのスクリーンショットについては、hugin.sourceforge.net を参照してください。) タブの下部で、「最適化」を「カスタムパラメータ」に設定します (これにより、「オプティマイザー」という名前の新しいタブが追加されます。そうでない場合は表示されません)。「スティッチャー」タブで、「投影」を「直線」に設定します。「制御点」タブには、テスト写真が2回表示され、写真の両方のバージョンでこれらの点群を選択することにより、同じ直線上にある点のセットを定義できます。

しかし、両方のバージョンで全く同じ点を選択しないでください。両方の画像で点が同一である場合、オプティマイザは簡単な方法を選択し、1対1の対応のパラメータを決定してしまう可能性があります。代わりに、画像の両方のバージョンで同じ線上にある異なる点を選択するべきです。テスト目的で、画像の端付近、直線がより歪んでいる場所に、そのような点集合をいくつか定義することができます。Huginでそのような点集合を定義することは、かなり面倒な作業であることがわかるでしょう(これは、lensfunデータベースがそれほど大きくない理由の1つかもしれません)。

次に、「オプティマイザ」タブに切り替え、Ctrlキーを押しながら左クリックして最適化するパラメータを選択します。(タブの上部にあるヒントを参照してください。)「Yaw(y)」、「Pitch (p)」、レンズパラメータ「a」、「b」、「c」を最適化することをお勧めします。水平視野「Hfov (f)」は、テスト画像のEXIFデータから、FocalLengthIn35mmFilmエントリfを使用して計算されます。
 Hfov = 2 × arctan (18 mm / f) 
ここで、18mmは35mmネガ(36×24mm)の幅の半分です。次に、「今すぐ最適化!」ボタンを押します。結果のパラメータ「a」、「b」、「c」は、広角レンズの場合は0.01未満、魚眼レンズの場合は0.1未満になるはずです。値が大きい場合は、最適化が失敗した可能性があります。その場合は、「コントロールポイント」タブで点集合を確認してください。コントロールポイントの順序が間違っているか、対応する線に正しく関連付けられていない可能性があります。オプティマイザは、提供された開始セット(数学的には開始ベクトル)にも敏感であるようです。つまり、すべてのパラメータをゼロに設定するのは間違った選択かもしれません。「オプティマイザ」タブの値をダブルクリックするか、タブページの右下にある「最適化する前にスクリプトを編集」チェックボックスをアクティブにすることで、開始ベクトルを編集できます。これにより、最適化の前にテキストボックスが表示され、Huginプロジェクトファイルの対応するセクションを編集できます。オプティマイザを再起動する前に、開始ベクトルa、b、cをa0.0 b0.0 c0.0(または他の適切な値)に戻します。経験上、特に魚眼レンズの場合、「a」を正の値に設定すると役立つ場合があります。固定レンズを備えたカメラの場合、このキャリブレーションは一度だけ行います。ズームレンズ付きのカメラの場合、約5つの異なる焦点距離でキャリブレーションすることにより、焦点距離の全範囲をカバーする必要があります。そのようなパラメータセットを決定したら、ImageMagickで

          

  magick calibration_image.jpg -distort barrel 'a b c' flat.jpg
a b cを決定した値に置き換えてテストします。出力画像の線は完全にまっすぐでなければなりません。そうでない場合は、最適化が失敗しており、異なる開始ベクトルまたは修正されたコントロールポイントセットを使用して実行する必要があります。

ポイントセットの定義

本格的なキャリブレーションを行うには、Huginプロジェクトファイルを手動で編集し、他の方法で点の座標と点集合を定義することをお勧めします。プロジェクトファイルは拡張子がPTOのプレーンテキストファイルであり、単純なテキストエディタで開いてポイントリストを提供できます。# control pointsセクションの1行は次のようになります。
  c n0 N0 x175.0 y87.8 X1533.3 Y62.6 t3
ここで、x, yはソース画像(タブの左側の画像)のピクセル座標、X, Yはターゲット画像(タブの右側の画像)のピクセル座標です。この特別なケースでは、実際には同じ画像の2つのバージョンです。(通常、これらはパノラマで隣り合う2つの異なる画像になります。)イントロc n0 N0は標準コードであり、トレーラーt3は、インデックス3から始まる関連する直線の番号です。上記の例からわかるように、ピクセル座標には小数部分が含まれる場合があります。もちろん、x, yX, Yは同じ直線上にある必要があります。ただし、オプティマイザはこの場合に動作を拒否するため、同一であってはなりません(上記参照)。これを保証する最も簡単な方法は、両方の画像で同じ点を使用しますが、ターゲット座標の順序を逆にすることです。たとえば、左側の画像でp1、p2、p3、p4を使用し、右側の画像でP4、P3、P2、P1を使用します。ポイント選択ツールを使用して、ソース画像のピクセル座標を決定します。このようなデータの保存が可能な任意の画像ビューアを使用して、これを行うことができます。プラットフォームに依存しないツールはFijiです。(Windowsで作業している)私は、WinMorphのポリラインを使用してこれを行いました。点を拾うときは、事前に定義された戦略に従う必要があります。たとえば、各(多かれ少なかれ)水平線上で、左から右に移動する同じ数の点を選びます(つまり、テレビのブラウン管の陰極線ビームのように、画像全体でジグザグ線をたどります)。このような戦略により、ターゲットポイント座標の順序付けが簡素化されます。ソースとターゲットの点の座標を定義するテキストファイルの行は、手動またはソフトウェアツールを使用して確立できます。(私はこのタスクを実行するためにExcel VBAサブルーチンを使用しています。)準備ができたら、ポイントリストをPTOファイルの対応するセクションにコピーし、保存してHuginで再度開きます。結果は次のようになります。
[IM Output]
Huginのコントロールポイントグリッド
キャリブレーション画像と対応するHuginプロジェクトの両方が含まれる既製の例は、ZIPファイルolympus_c2500l.zipで提供されています。

カメラで作成されたサムネイルからのリエンジニアリング

一方に樽型歪みがあり、もう一方にすでに補正されている画像ペアがすでに存在する場合はいくつかあります。この補正は、補正パラメータについて何も教えてくれない、他のレンズ補正ソフトウェアを使用して実行されている場合があります。さらに、多くの現代のカメラ(2019年)は、JPEG画像のレンズ補正を内部で実行することを提供しています。ただし、この機能は通常、RAW画像には適用されません。(まあ、それは生データです。)それにもかかわらず、RAW画像には、カメラによってすでに補正が適用されているJPEGプレビューが含まれています。ImageMagickは、dcrawを使用してRAW画像を読み取ることができます。したがって、レンズ補正なしでRAW画像をJPEGにmagickし、結果を内部で補正されたJPEGサムネイルと比較することができます。このような画像ペアの場合、補正パラメータは簡単に計算できます。両方の画像で対応するポイントペアを選択することにより、rRの関係を直接確立できます。
[RAW Image]
RAW画像(樽型歪み) [Corrected Image]
補正されたサムネイル(リエンジニアリング対象)
上記の例に示すように、どのポイントペアを選択するかは自由に選択できます。これらは直線をたどる必要もなく、幾何学模様上に配置する必要もありません。rRの対応する値の表を入力し、たとえば
スプレッドシートダイアグラムを使用して回帰曲線を計算するだけです。
[Calabration]
キャリブレーションポイント
[Regression]
回帰(スケーリング済み)
したがって、ImageMagickのコマンドラインは次のようになります。

  magick barrel.jpg -distort barrel '0.0099 -0.0678 0.0014 1.0511' flat.jpg
同じコマンドをDNGカメラ形式の画像「barrel.dng」に直接適用することもできます。

レンズ補正の例

キャンプモバイル

[IM Output]
オリジナル
[IM Output]
補正済み
[IM Output]
差分
左側のキャンプモバイルの元の画像は、写真家の背後に急な下り坂があり、スペースが限られていたため、夕暮れ時にかなり短い距離から撮影する必要がありました。(照明条件が悪いのは、後処理での激しい稲妻に起因する青みがかった色合いの原因です。)元の画像は、特に画像上部近くの水平方向の縞模様と、構築物の後ろの隅に、顕著な樽型歪みを示しています。このショットに使用されたNikon Coolpix 995はPTlensのデータベースにあるため、中央に見られるように、歪みを容易に補正できました。右側の画像は、2つの写真のグレースケールバージョンの差を示しています。これは、2つを減算し、次に否定と極端なクリッピングとガンマ補正を行うことによって計算されます。繰り返しますが、補正の効果は、上部の水平方向の縞模様によって最もよく示されます。白い円(ゼロ差を示す)は、非スケーリング制限から生じます。画像の小さい寸法に等しい直径の円上の点は変更されません。

GoProのフラット化

GoProカメラレンズは、ブランドの一部であると思われる顕著な樽型歪みを生成します。たとえば、GoPro Hero 3+シルバーエディションには、固定焦点距離2.77mmの魚眼レンズがあり、感光領域全体を使用する場合、35mmフィルムでは焦点距離16mmに相当します。GoPro Hero 3+には、3つの写真モードがあります。
  • 10メガピクセル= 3680×2760ピクセル広角(35mmフィルムで16mm)
  • 7メガピクセル= 3072×2304ピクセル広角(35mmフィルムで16mm)
  • 5メガピクセル= 2624×1968ピクセル中角(35mmフィルムで23mm)
GoPro Hero 3+には、5.64のクロップファクターを持つ1/2.3インチセンサーが搭載されています。(これにより、35mmフィルムの焦点距離はわずか15.62mmになります。EXIF情報で提供される16mmは、おそらく四捨五入によるものです。)最初の2つのモードは、感光領域全体を使用しているようです。解像度の低下は、明らかにサブサンプリングによって実現されています。したがって、歪みパラメータは、実際には証明できるように、同じです。5メガピクセルモードは、明らかに感光領域の一部のみを使用しています。3680 / 2624×16≈23です。レンズパラメータは、次のように決定できます。
  • 広角
    • a = 0.06335
    • b = -0.18432
    • c = -0.13009
  • 中角
    • a = 0.01359
    • b = -0.06034
    • c = -0.10618
理論的には、2番目のモードのパラメータは、半径riRiがスケールファクターκ= 3680 / 2624 = 1.402によって結合されているため、最初のモードから導き出すことができます。これは、次のようになります。
  • a2 = a1 /κ³
  • b2 = b1 /κ²
  • c2 = c1
独立した最適化から得られた上記のパラメータは、これらの理論値とそれほど変わりません。同様に、さまざまなビデオモードのパラメータは、最適化によって、またはこのモードで使用されるセンサー領域の一部から導き出すことができます。ビデオの場合、水平視野はEXIFデータから導き出すことができません。これは、ビデオ自体から決定された(制御された条件下で映像を撮影することによって)使用される感光領域から計算するか、他のパラメータと一緒に推定することができます。つまり、最適化の自由パラメータとして残すことができます。HDビデオ(1920×1080)のパラメータは次のとおりです。
  • a = 0.030530
  • b = -0.124312
  • c = -0.038543
これらのパラメータは、ImageMagickを使用したフレームごとの補正に使用できます。あるいは、AVIsynthプラグインDeBarrelを使用してビデオ全体を「フラット化」するために使用できます。これもパノラマツールレンズ補正モデルを使用しています。

2つのキーボードel_supremo作

私が撮った2つのキーボードの写真は、17mmの焦点距離で撮影されたため、非常に明らかな樽型歪みがあります。
[IM Output]
この種の歪みは、たとえば、キヤノンのDigital Photo Professional(私はCanon 50Dカメラを持っています)で補正できます。SLRカメラの他のメーカーは通常、レンズのこの種の補正を行うためのソフトウェアを提供していますが、上記の例がこの写真でどれほいうまく機能するかを確認したかったのです。最初のステップは、LensFun Webサイトにアクセスして、カメラデータベースの最新バージョンをダウンロードすることです。パッケージを解凍し(winzipはWindowsで.tar.gzファイルを解凍できます)、 "lensfun/data/db"ディレクトリで、カメラメーカーに対応するファイルを探します。私の場合、 "slr-canon.xml"を調べました。これは、任意のテキストエディタで編集できます。ここで、私が使用している特定のレンズの情報を見つけます。この場合は "EF-S 17-85mm"です。そのレンズの情報は次のようになります。
<lens>
  <maker>Canon</maker>
  <model>Canon EF-S 17-85mm f/4-5.6 IS USM</model>
  <mount>Canon EF-S</mount>
  <cropfactor>1.6</cropfactor>
  <calibration>
    <distortion model="ptlens" focal="17" a="0.021181" b="-0.055581" c="0" />
    <distortion model="ptlens" focal="20" a="0.019344" b="-0.043786" c="0" />
    <distortion model="ptlens" focal="22" a="0.015491" b="-0.026682" c="0" />
    <distortion model="ptlens" focal="28" a="0.008084" b="-0.007472" c="0" />
    <distortion model="ptlens" focal="30" a="0.005522" b="-0.001763" c="0" />
    <distortion model="ptlens" focal="35" a="0.003149" b="0.002207" c="0" />
    <distortion model="ptlens" focal="44" a="0" b="0.008269" c="0" />
    <distortion model="ptlens" focal="53" a="0" b="0.008792" c="0" />
    <distortion model="ptlens" focal="61" a="0" b="0.00738" c="0" />
    <distortion model="ptlens" focal="72" a="0" b="0.006226" c="0" />
    <distortion model="ptlens" focal="78" a="0" b="0.007095" c="0" />
    <distortion model="ptlens" focal="85" a="0" b="0.007288" c="0" />
  </calibration>
</lens>
キャリブレーションエントリは、17mmから85mmまでの焦点距離範囲の歪み値を提供します。必要な焦点距離がこの2つの値の間にある場合は、最も近い値を選択するか、値を補間することができます。補正する写真は17mmで撮影されたため、キャリブレーション情報の最初の行の情報が必要です。そこから以下の値が得られます: a="0.021181" b="-0.055581" c="0" これらはレンズの歪みを補正するために使用される3つのパラメータです。ただし、IMの一部の古いバージョンでは、樽型歪み補正に4番目のパラメータdが必要です。幸いなことに、次の簡単な式を使用して、他の3つからdの値を簡単に計算できます: d = 1-a-b-c つまり: d="1.0344" です。
IMは、歪み引数として提供されない場合、'd'の値を自動的に計算しますが、IMの一部の古いバージョンではこれは行われませんでした。
そのため、レンズの歪みを補正するための実際の樽型歪み補正は...

    magick keyboards.jpg \
          -distort barrel "0.021181 -0.055581 0" \
          keyboards_ptlens.jpg
[IM Output]
JPEGは非可逆圧縮であるため、画像の処理が完全に完了するまでJPEGに保存しないでください。
元の写真では、譜面台の底部と上部キーボードに沿って歪みが特に顕著です。これらの歪みは、出力写真ではほぼ完全に解消されています。この結果とキヤノンのソフトウェアから得られた結果を視覚的に比較すると、本質的に同じ結果が得られます。El-Supremo