ImageMagick の例 —
デジタル写真の処理

索引
ImageMagick の例 序文と索引
デジタルカメラのメタデータ、EXIFプロファイル
デジタル写真の向き
色の調整
写真変換レシピ集
ImageMagickの主要な用途の1つは、最新のデジタルカメラで撮影された写真の処理と修正です。これらのカメラは一般的に非常に大きく高解像度の写真を撮影し、時間、スケール、ズーム、カメラ、向きなどのメタデータを含んでいます。携帯電話にカメラを接続する計画もあり、写真が撮影された場所や、写真に写っている人物(カメラの前にある携帯電話から)を推測することもできます。ここでは、デジタル写真の基本的な処理方法、さらには芸術的なレンダリングなどの他の目的のために変換する方法について説明します。デジタル写真の改良に協力してくれたデジタルカメラユーザーのWalter Dnes氏に感謝いたします。

デジタルカメラのメタデータ、EXIFプロファイル

デジタルカメラが写真を撮ると、JPEG保存ファイルに多くの追加情報が含まれます。このメタデータはEXIFプロファイルとして知られており、写真ラボや開発のために特に提供されています。「-verbose」設定を付けたImageMagickの「magick identify」コマンドはこのEXIF情報を表示します。これは、私が中国南部の昆明動物園で撮影したパゴダの写真のEXIFデータです。

  magick identify -format "%[EXIF:*]" pagoda_sm.jpg |\
      sed 's/\(.\{46\}\).*/\1/' | column -c 110
[IM Text]
EXIFデータまたは識別出力は、大文字と小文字を区別しない方法で処理する必要があります。たとえば、多くの古いバージョンのIMは「EXIF:」(大文字)ではなく「exif:」(小文字)を出力します。
ここでは、同様の例ですが、「グロビング」(シェルのような)式を使用して、時間を含むEXIFフィールドに出力を制限しています。

  magick identify -format "%[exif:*time*]" pagoda_sm.jpg
[IM Text]
この写真のEXIFプロファイルには、多くの情報が含まれています。例えば
  • 私のカメラはパナソニック('Make')、DMC-LZ1('Model')です。
  • カメラは回転していました('Orientation')。しかし、EXIFデータを調整せずに回転を修正したはずです。カメラはわずかに上向きに傾いていましたが、その情報は記録されていません。
  • 'FocalLength'が'37mm'であることは、カメラの'光学ズーム'機能を使用しなかったことを示しています。私のカメラは最大6倍の光学ズームで'FocalLength'は'366/10'または'222mm'になります。
  • そして'DigitalZoomRatio'は、デジタルズームも使用しなかったことを示しています。
  • カメラはまた、高速な1/8秒の'ExposureTime'、3mmの開口'MaxApertureValue'、または'FNumber'の'5.6'、そして'ISOSpeedRating'の'64'を使用しました。
  • フラッシュ('LightSource')は使用されませんでした。
  • 元の画像は1728 x 2304ピクセル('ExifImageLength'と'ExifImageWidth')でした。ただし、確認したい場合は、実際の画像は小さくなっています。そのため、トリミングまたはサイズ変更を行ったはずです。
  • 'DateTime'文字列によると、おそらく最も重要なことに、2005年7月9日午後2時5分頃に撮影されました。これは、カメラの時間が正しく設定されていたことを前提としています(実際には正しく設定されていました)。
  • より近代的なカメラは、GPSの位置情報や、おそらくビューのコンパス方向さえ持っているかもしれません!
上記には記載されていませんが、カメラ自身のディスプレイで使用された小さなサムネイルプレビュー画像も含まれています。写真ラボで現像または印刷したい写真をマークしたり、他の印刷パラメーターを調整したりするための機能もあります。しかし、これはほとんどの人にはめったに使用されません。これらの設定の多くはユーザーにとって非常に役立ちますが、人々にとって最も役立つのは一般的に写真の年月日です。もちろん、これは写真が撮影される前にカメラで年月日が正しく設定されていたことを前提としています。また、多くの人が画像の向きに関心があり、表示時に正しく回転させることができます。つまり、次に見ていくことです。これらすべてのデータ、特にプレビュー画像は、画像にかなりの容量を占める可能性があります。そして、私が2005年7月に中国の昆明にいたことを世界中の人々に知られたくないかもしれません。そのため、実際にはWorld Wide Webに公開する前に、画像からEXIFデータを削除することをお勧めします。また、デジタルカメラからの画像のサイズは通常非常に大きく(そして大きくなっている)、写真品質レベルで印刷できますが、WWWの使用には大きすぎます。特にサムネイルには大きすぎます。そのため、ユーザーが写真品質の画像を実際に印刷できるようにしたい場合を除き、元の画像を直接公開することはお勧めしません。たとえば、上記の画像はIMの例で使用するためにトリミングおよびサイズ変更されていますが、例としてEXIFデータは意図的にそのまま残されています。通常はこれらの情報を削除します。

デジタル写真の向き

PhotoshopはEXIFの'Orientation'設定に基づいてデジタル画像を自動的に回転させると聞いています。IMも、画像を読み込んだ後に「-auto-orient」演算子を含めることでこれを行います。ただし、これは重要です。
JPEG形式はロスのある形式です
これは、JPEGファイル形式をデコードして保存するたびに、画像がわずかに劣化することを意味します。一般的な画像プロセッサとして、IMは常にフォーマットを完全にデコードして再エンコードするため、画像を再保存すると常にJPEG画像が劣化します。JPEG形式の性質の詳細については、「JPEG画像ファイル形式」を参照してください。重要なのは、IMを使用してデジタル写真の向きを修正する(「-auto-orient」を使用)のは、サムネイルの作成画像への注釈付け透かしの追加、または露出調整など、他の画像修正操作を実行する場合のみです。IMは、画像プロパティエスケープを使用して、写真から現在の向き(数値として)を抽出できます…

  magick identify -format '%[exif:orientation]' pagoda_sm.jpg
[IM Text]
IMは特別な「-orient」演算子を提供します(可能な値を確認するには「-list orientation」を使用してください)。

  magick pagoda_sm.jpg -orient bottom-right \
                 -format '%[exif:orientation]'   info:
[IM Text]
これらのメタデータ設定方法により、特に回転させた写真の向きを調整できます。正しく向き付けられた写真は、向きが'Top-Left'または1であることに注意してください。もちろん、後で「-auto-orient」を使用する予定がある場合は、EXIFメタデータ(「-strip」または「-thumbnail」を使用)を削除しないでください。画像メタデータを削除する前に使用してください。画像を劣化させたり、変更したりせずに写真の向きを修正したい場合は、JHeadプログラムを使用することをお勧めします。たとえば、ここでは写真の向きを修正し、ディレクトリ内のすべてのデジタル写真の組み込みプレビューサムネイルを削除します。

  jhead -autorot  *.jpg
JPEGのロスレス回転は、サイズが8または16の倍数である画像に対してのみ正しく機能します。これは、ほとんど(すべてではない)デジタルカメラの写真に当てはまります。奇数のサイズの画像でこれを行うと、(部分的なサイズを含む)右端または下端のブロックが最終画像で正しく配置されません。これらのブロックは、右端または下端のみに存在できるためです。

これの例については、この特定の議論を参照してください。
JHeadプログラムを使用すると、写真の年月日(カメラの時間が間違っていた場合、または異なるタイムゾーンに移動した場合)、プレビューサムネイルの抽出/削除/置換、画像のコメントフィールドの設定、Photoshopプロファイルの削除、基本的な画像のトリミング(自分を露出している見知らぬ人を削除するため;-)などを行うことができます。JPEG画像データを劣化させることなく。このプログラム、または同様のプログラム(その他のJPEG処理プログラムを参照)を使用して、この情報を修正することをお勧めします。JPEG画像データをデコード/再エンコードしないようにしてください。向きに関する最後の1点。カメラをほぼ真上または真下に指した場合は、EXIFの向き設定が正しく解決されない場合があります。角度付きまたは傾斜したショットにも同じことが言えます。向き(およびカメラ)には、これらの状況に対する感覚がありません。このような写真の場合、唯一の選択肢は、下位レベルの非可逆圧縮「jpegtrans」またはIM「-rotate」を使用して自分で回転し、EXIFの向き設定をリセットする(JHeadまたはIMの「-orient」演算子を使用)か、EXIFプロファイルを削除することです。
Other IM Lossy Modifications...
  If you are also resizing or otherwise modifying the image, such as reducing
  its quality and size for use on the web, then data loss is already a fact.
  As such during those operations IM can do similar things, allowing you to do
  all the required operations in a single 'load-save' cycle.

  Rotate ALL images to landscape   -rotate 90\<
                       portrait    -rotate -90\>


色の調整

先に進む前に、使用される一般的な色の修正方法の紹介として、色の修正を最初に参照することをお勧めします。「-normalize」を使用する)高コントラストの線画やグラフィックは素晴らしいものですが、正規化された写真は非現実的に見えることがあり、前述のように、印刷もよくない場合があります。「-contrast-stretch」演算子で正規化の「境界」を制限できますが、「-levels」および/または「-sigmoidal-contrast」演算子を使用すると、「よりスムーズな」調整を行うことができます(これらの演算子が実行する操作の詳細については、ヒストグラム調整を参照してください)。上記の入力は、IMメーリングリストの「Tong」からのものです。

露出不足写真の明るさ調整Walter Dnes氏提供

適切な露出を可能にするのに十分な光がない場合があります。他の場合では、モーションブラーを除去するために、最適な時間よりも短い露出時間を使用する必要がある場合があります。露出不足のデジタル写真は、「-sigmoidal-contrast」演算子を使用して、'0%'のしきい値レベルで、ハイライトを吹き飛ばすことなく、暗い領域を優先的に明るくすることができます。シグモイド非線形コントラストで詳細を参照してください。これは、日没後の無料コンサートで撮影された、わずかに露出不足の例です。明るく照らされた領域が多く、クリアですが、より見やすくしたい暗い領域もあります。

  magick night_club_orig.jpg  -sigmoidal-contrast 4,0%  night_club_fixed.jpg
[IM Output] ==> [IM Output]
常に、中間作業にはTIFFやPNGなどの非可逆圧縮形式を使用する必要があります。JPEG形式は、Web公開のためにディスク容量とダウンロード帯域幅を削減するためにのみここで使用されます。

小さなサムネイルではなく、例で使用されている拡大版を見るには、画像を選択してください。
そして、これは主要なアンダーエクスポージャーの例です。これは、私のバルコニーから南に向かってトロント市を見下ろす夜景です。

  magick night_scape_orig.jpg -sigmoidal-contrast 10,0%  night_scape_fixed.jpg
[IM Output] ==> [IM Output]
主なパラメーターは、明るさの量を制御します。必要な明るさが増すほど、使用される値が高くなります。そして、出力画像はよりざらざらして見えます。これは、小さなピクセルエラーも強調されるためです。シグモイドコントラストによる明るさは、スペクトルの赤端を強調しない傾向があります。本当に必要な明るさレベルではなく、最も自然な肌の色になるパラメーターを選択する必要がある場合があります。大幅なアンダーエクスポージャーの場合、明るさを上げた後、粒状の白黒画像になります。これは、デジタル画像処理の物理的な制限です。色のデータが存在しない場合、IMはそれを生成しません。実際には、私のバルコニーの右側にあるレンガは赤みがかっており、下の木々は緑色です。

ビニング - デジタルノイズの低減Walter Dnes氏提供

多くの真剣な写真家は、デジタルカメラメーカーによる「メガピクセル競争」の副作用に不満を持っています。メーカーは、デジタルカメラのセンサーに小さなピクセルを多く詰め込むことでメガピクセル数を増やしています。ピクセルが小さくなると、同じISO設定でのノイズの多い画像になり、低いISO設定を使用せざるを得なくなります。ノイズを避けるために低いISO感度を使用すると、露出時間が長くなります。これは、内蔵フラッシュの10フィートの範囲を超える屋内では、三脚にカメラを設置して撮影する静物写真以外では、ほとんどの民生用デジタルカメラが事実上役に立たないことを意味します。多くのデジタルカメラユーザーは、より高いISO設定でノイズの少ない画像のためにいくつかのピクセルを喜んで交換しますが、企業をコントロールするマーケティング担当者は、これを選択肢として検討することを拒否します。幸いなことに、このトレードオフは、デジタル写真の後に行うことができます。専門用語は「ビニング」です。簡略化された理論は以下の通りです…
  • n×nのピクセルグリッドを取り、そのコンポーネントの平均値を計算して1つの「スーパーピクセル」を取得します。
  • 信号は組み合わせたピクセル面積に比例し、これは信号量がn²倍増加したことを意味します。
  • ノイズはランダムです。つまり、組み合わせたピクセル面積の平方根、つまりnに比例します。その結果、SNR(信号対ノイズ比)はn倍増加します。詳細はPhoto Glossary, Binningを参照してください。
1600×1200のデジタル写真を800×600にビニングダウンする場合(つまり、2×2グリッド)、信号対ノイズ比は2倍になります。同様に、2560×1920の画像を3×3で853×640ピクセルにビニングすると、信号対ノイズ比が3倍向上します。
ビニングを使用するには、写真画像は最終的な目的のサイズの整数倍である必要があります。
ImageMagickでは、特別な「-filter」設定の「box」は、画像を「-resize」する場合、ピクセルのグループを1つのピクセルに平均化します(詳細はリサンプリングフィルターを参照)。つまり、「ビニング」を行うには、画像を正しくリサイズするだけで済みます。
建設中
Walter Dnesも、計算を実行し、画像を最小限にクロップし、「ビニング」を実行する元のスクリプトbinnを提供しました。ビニング例3ビニング例4

写真変換クックブック

わずかな回転補正-- 写真をより水平にする

典型的な状況。写真を撮影しましたが、画像が水平ではなく、修正したいと考えています。[IM Output]たとえば、これは2008年に北京で、紫禁城のすぐ裏にある景山公園の丘から、手持ちカメラを使って撮影した写真です。紫禁城自体ではありませんが、丘の反対側にある寺院です。サムネイルをクリックして、大きな画像を表示してください。はい、画像は小さく、小さなサムネイルではなく元の画像にこの解決策を適用する必要がありますが、テクニックはどの画像でも同じです。この場合、画像を-1.8度回転させる必要があります。
画像を単純に回転するだけで、コーナーに色の領域を含むわずかに大きな画像が得られ、修正が目立ち、ひどいものになります。

  magick beijing_tn.png -rotate -1.95  beijing_rotate.png
単純な画像回転で示されているように、画像を元のサイズにクロップした場合でも、色の付いたコーナーが残ります。
[IM Output]
最も簡単な解決策は、その結果をクロップして境界線を削除することですが、そうすると画像のサイズがかなり奇妙になり、何かがされたことが再び明らかになります。そのクリッピングを行うための式は単純ではありませんが、歪み回転方法で説明されています。
より良い解決策は、画像を回転させるだけでなく、わずかに拡大縮小して、元の画像と同じサイズの回転画像を作成することです。

  angle=-1.95
  magick beijing_tn.png -distort SRT \
     "%[fx:aa=$angle*pi/180;(w*abs(sin(aa))+h*abs(cos(aa)))/min(w,h)], $angle" \
     beijing_rot_correction.png
[IM Output]
そして、画像は完全に水平な壁で清潔に見えます。角度計算は、画像内の長い直線の端にあるピクセルの位置を使用して、比較的簡単な三角法です。ただし、試行錯誤でさまざまな小さな角度で画像を回転するだけで、比較的迅速に適切な回転角が見つかることがわかりました。特定の角度がどれほど優れているかを調べるには、使用している線またはエッジに沿ったピクセルを非常に拡大して見てください。この写真では壁の上部です。そして、画像回転では、左回転または反時計回りの回転は負です(Y軸が下向きを指しているため)。また、可能な限り常に元の画像に操作を適用し、中間画像(特に中間JPEG画像)の使用を避けてください。保存された中間コピーよりも、元のソースから始めて写真修正を適用する方が常に優れています。

チルトシフト効果-- 風景を人工的なモデルのように見せる

[IM Output]「チルトシフト」は、画像の上下をぼかしながら、画像の中央をぼかさないようにするテクニックです。元々は、レンズを傾けて画像の上下をぼかす非常に古いベローズタイプのカメラで行われていました。v6.5.4-0でImageMagickに追加された可変ぼかしマッピングのおかげで、これは現在簡単に行うことができます。これに加えて、影を強調し、色を飽和させることで非常に高いコントラストを追加すると、通常の画像は人工的に見えるという典型的な結果が得られます。まるで、小型で非常に詳細で明るく照らされたモデルの写真を撮っているかのように。
最初にやるべきことは、画像の色を強調して非常に高いコントラストを与え、おそらく少し明るくして、強いスタジオライトで非常に明るく照らされているように見せることです。

  magick beijing_md.jpg -sigmoidal-contrast 15x30% beijing_contrast.jpg
[IM Output]
これらの色の効果を得るために、強力なシグモイドコントラスト操作を使用したことに注目してください。画像の最も明るく暗い色を「クリップ」したくなかったので、線形コントラストを単純に使用しませんでした。「15」のコントラスト値は非常に強力なコントラストです。また、コントラスト閾値の中心を「30%」のグレー値にオフセットすることで、画像を少し明るくしました。コントラスト強調画像の色が十分に漫画チックにならない場合は、モジュレート演算子を使用して画像の色飽和度を高めることを検討してください。この画像には、タイル張りの屋根と明るい緑色の木々ですでに十分な色の効果があるため、必要ありませんでした。画像の拡大図を見ると(サムネイルをクリック)、色を強調するだけでも、画像に人工的な光の感じが与えられますが、背景の車や前景の人物には細部が多すぎるため、モデルのように見えません。
次に、チルトシフトです。これには、上下が白で、中央が黒のグラデーション画像を作成します。線形グラデーションを使用する人もいますが、放物線グラデーションの方が優れていると思います。

  magick beijing_contrast.jpg \
          -sparse-color Barycentric '0,0 black 0,%h white' \
          -function polynomial 4,-4,1   beijing_blurmap.jpg
[IM Output]
元の画像自体を2点重心スパースカラーリングを使用して、画像全体に線形グラデーションを生成したことに注目してください。その線形グラデーションは、基本的な多項式関数を使用して変更され、中央に黒の放物線グラデーションになります。これで、ぼかしマップに従って画像をぼかすだけで、「チルトシフト」効果を作成できます。その結果、元の画像は、実際のスナップショットではなく、スケールモデルのように見えます。

  magick beijing_contrast.jpg  beijing_blurmap.jpg \
          -compose Blur -set option:compose:args 10 -composite \
          beijing_model.jpg
[IM Output]
最終画像に見られるように、強い色のため、木々と建物は非常に人工的に見えますが、近くと遠くの部分のぼかしにより、画像に「小型」モデルのような感じが与えられています。ただし、これは非常に詳細なモデルだったに違いありません!結果は、チルトシフト処理の一部として回転補正(前述)を実行することでさらに改善できたでしょう。完璧なカメラの向きは、単に人工的な感覚に追加されます。もちろん、これらの操作をすべてまとめて1つのコマンドで実行し、一時ファイルや画質の低下を回避できます。

  magick beijing_md.jpg -sigmoidal-contrast 15x30% \
          \( +clone -sparse-color Barycentric '0,0 black 0,%h gray80' \
             -solarize 50% -level 50%,0 \) \
          -compose Blur -set option:compose:args 10 -composite \
          beijing_model.jpg
上記では、放物線グラデーションをより従来の線形白黒グレーグラデーション(同じ傾斜)に置き換えて「チルトシフト」ぼかしマップを作成しました。ソーラライズとレベルテクニックを使用して、線形グラデーションを画像の下部から約1/3の水平方向にピークさせました。ただし、線形グラデーションの焦点領域は小さすぎて実用的ではありません。チルトシフト効果に適したグラデーションを生成する方法は他にもたくさんあります。たとえば、リサイズされたグラデーションを使用します。または、ピクセルの単一列のシェパーズスパースカラーを水平方向にスケーリングします。正弦曲線グラデーションも役立つ場合があります。
速度の最適化
可変ぼかしマッピング操作は、本質的にシングルパスの2次元ぼかし方法(均一なガウスぼかしに相当)を使用しています。ただし、ぼかし操作を2つの1次元可変ぼかし操作で行うことで、一般的な速度向上を得ることができます。たとえば、ここでは最初に水平方向に、次に垂直方向にぼかします…

  magick beijing_md.jpg -sigmoidal-contrast 15x30% \
          \( +clone -sparse-color Barycentric '0,0 black 0,%h gray80' \
             -solarize 50% -level 50%,0 -write mpr:blur_map \) \
          -compose Blur -set option:compose:args 10x0 -composite \
          mpr:blur_map \
          -compose Blur -set option:compose:args 0x10 -composite \
          beijing_model_2pass.jpg
結果は実質的に同一です(ただし、多少異なります)が、処理速度がはるかに速くなります。補足:操作を交換すると(垂直方向にぼかしてから水平方向にぼかす)、このタイプのぼかしマッピングではより正確な結果が生成されると考えられます。基本的に、水平ぼかしはそのぼかしパスの方向で一定であるため、最後に実行する必要があります。
チルトシフト効果と実物モデルの問題点
結果の写真を注意深く見ると、それが偽のチルトシフトであり、実物モデルの写真ではないことがわかります。これは、建物のベースと比較して、大きな建物の屋根がぼやけすぎていることからわかります。ベースとほぼ同じ距離にあるにもかかわらずです。「壁」のベースは、壁の上部よりもぼやけています。つまり、偽物であることがわかります。問題は、大きな垂直方向のオブジェクトは、高さによって変動するぼかしではなく、表面全体で同じ量だけぼかす必要があることです。ぼかしのグラデーションは、画像内のさまざまなオブジェクトの焦点深度、つまり距離を表すことを忘れないでください。そのため、垂直方向のオブジェクトの表面はすべて同じ「距離」にあるため、同じ量だけぼかす必要があります。修正するには、ぼかしのグラデーションを調整して、それらの領域が、画像の残りの部分と比較して、そのオブジェクトの「ベース」の一定(またはほぼ一定)の色を持つようにする必要があります。つまり、垂直面は一定のぼかし量を持ち、水平面はすべてぼかしのグラデーションを持ちます。基本的に、ぼかしのグラデーションは、画像内の各点の実際の「深度」を表す必要がありますが、ほとんどの画像では非常に複雑なグラデーションです。この調整は、水平な壁とは何か、オブジェクトが画像内でどのくらい離れているかを人間が解釈する必要があるため、達成するのが難しい場合があります。また、容易に自動化できる可能性も低いです。この効果で何ができるか?チルトシフト画像をメールで送ってください!ここに参照します。あるいは、上記の例でチルトシフトの欠陥を修正することもできます。

PNG-JPEGレイヤードイメージ

大きな新聞や雑誌のページを、白い背景のみを使用したPNGとして保存されたテキストレイヤーと、JPGとして保存された画像レイヤーに分割することにより、2つの画像を組み合わせたものよりもはるかに少ないディスク容量を使用できます!より重要なことに、画像はロスのある圧縮(JPEG)を使用でき、テキストコンポーネントは鮮明でクリアなままです(PNG)。ばかげて奇妙に聞こえますが、実際には本当です。分離された画像は、単一の組み合わせ画像で使用されるディスク容量の3〜4倍を節約できます。通常、2つの画像は、公開プロセス中に別々のレイヤーとして生成されます。しかし、後で画像を分離することもできます。画像は単に重ね合わされています…

  magick ny_family.jpg ny_family.png -composite   ny_family_merged.jpg
[IM Output] ==> [IM Output] ==> [IM Output]
拡大したコピーを表示するには、結果の画像を選択します。
これは通常のオーバーコンポジションを使用しており、PNG(オーバーレイ)画像が透明である必要があります。この透明性は、上記のように、ブール(純粋なオン/オフ)マスクとして2つの形式で提供されます。画像分離の例コードを歓迎します。

写真の重ね合わせ-- ぼやけたオーバーラップされた写真

一連のオーバーラップする写真を作成することは(パノラマという意味ではありません)、特にウェブサイトの作成において一般的なタスクです。しかし、IMオペレーターに関する正しい知識がない限り、実行するのは難しい場合があります。最も簡単な方法は、2つの画像のマスク付き合成と、オーバーレイする画像を選択するためのマスクを使用することです。ただし、最初に簡単な数学を行う必要があります。この例では、サイズは120x90ピクセルの2つのサムネイル画像を使用しており、水平方向に40ピクセルオーバーラップさせたいと考えています。これは、結果の画像は幅120 + 120 - 40ピクセル、つまり200x90ピクセルの画像になることを意味します。次に、マスクが必要です。これは片側を黒、もう片側を白にし、中央に40ピクセルのグラデーションを配置する必要があります。出力画像のサイズです。つまり、120ピクセル - 40ピクセルで、2つのオーバーラップされていない領域それぞれに80ピクセルの領域が得られます。では、マスク画像を生成しましょう…

  magick -size 90x80 xc:white xc:black   -size 90x40 gradient: \
          +swap -append -rotate 90    overlap_mask.png
[IM Output]
マスク画像を生成する別の方法は、Fred Weinhausの「plmlut」水平グラデーションジェネレータースクリプトを使用することです。これは、上記で生成したシャープな線形グラデーションではなく、グラデーションの曲率をより細かく制御できます。これで数学的な計算は終わったので、残りは、生成したマスクを使用して、3つの画像のマスク付き合成を実行することだけです。ただし、オーバーラップする右側の画像(任意の色)に必要なスペースを提供するために、宛先(左側)の画像を拡大し、適切な重力(右側、または 'East')を使用して2番目の画像を正しく配置する必要があります。

  magick holocaust_tn.gif -extent 200x90  spiral_stairs_tn.gif \
          overlap_mask.png  -gravity East -composite   overlap_photos.jpg
[IM Output] [IM Output]  + [IM Output] ==> [IM Output]
そして、線形グラデーションを使用してオーバーラップされた2つの画像ができました。もちろん、2つのコマンドを1つのコマンドにマージして、「マスク」の中間画像を保存する必要がないようにすることもできます。これは読者の練習問題として残しておきます。わずかな改善策としては、画像間のオーバーラップを大きくして、よりカーブしたグラデーションを使用することです。これにより、最終画像のオーバーラップ領域の先頭と末尾に見える急激な変化が減少します。特に、非常に異なる色の大きな領域を含む画像の場合です。たとえば、これはいくつかの歪んだグラデーション技法を使用して、滑らかなグラデーションカーブを生成するだけでなく、そのグラデーションを回転させて、非常に角度のついたオーバーラップにすることができます。

  magick -page +0-15 -size 1x30 gradient: \
          -sigmoidal-contrast 5,50% -contrast-stretch 0 \
          -set option:distort:viewport 180x90-90-45 \
          +distort SRT 115 +repage \
          holocaust_tn.gif -extent 180x90 +swap \
          spiral_stairs_tn.gif +swap \
          -gravity East -composite   overlap_angled.jpg
[IM Output]
はい、上記はかなり複雑ですが、何が可能であるかを示しています。2つ以上の画像を処理する予定がある場合は、マスクを使用して、2番目以降の画像の透明度を直接設定する方が良い方法です。次に、複数の画像は、レイヤードイメージの例で示されている手法を使用して、一緒にオーバーレイできます。これらの手法の中には、IMが最終的な画像サイズを計算できるため、最終的な画像サイズを計算する必要がないものもあります。画像を正しく配置するだけで済みます。たとえば、ここでは、2番目と3番目の画像に30ピクセルのグラデーションを追加しており、画像をそれぞれ90ピクセル(幅120マイナス30ピクセルのオーバーラップ)間隔で配置する必要があります。すべての画像に適切な透明度と位置が与えられたら、モザイクをレイヤーに一緒に適用するだけで(すべてのオフセットは正)、IMが最終的なキャンバスサイズを計算します。

  magick -size 90x90 xc:white -size 90x30 gradient: -append -rotate 90 \
          hatching_tn.gif \
          \( chinese_chess_tn.gif -clone 0 \
                 -compose CopyOpacity -alpha off -composite -repage +90+0 \) \
          \( holocaust_tn.gif -clone 0 \
                 -compose CopyOpacity -alpha off -composite -repage +180+0  \) \
          \( spiral_stairs_tn.gif -clone 0 \
                 -compose CopyOpacity -alpha off -composite -repage +270+0 \) \
          -delete 0   -compose Over  -mosaic     overlap_series.jpg
[IM Output]
オーバーラップするマスクされた画像の位置を事前に計算する代わりに、オーバーラップの追加増分計算された位置にある手法を使用できます。より長い画像シーケンスの場合。**最終的な注意事項:**このようなオーバーラップする写真は、全体的な色が比較的共通している画像に最適です。また、シーケンスの両端にある画像については、画像の片側だけにオーバーラップがあるため、中央の被写体が中央に配置されていないように見えることに気付くかもしれません。この問題は、それらの画像の外側の端を透明にフェードさせるか、外側の端の一部を切り捨てることで、被写体を再中央に配置するのに役立ちます。`補足:異なる色空間で合成を行う方がうまくいく可能性があります。実験して結果(良いか悪いか)を報告していただけませんか?`

多重露光-- 同じシーンの複数の写真の混合

古い時代のフィルムベースのカメラでは、フィルムを「巻き戻さ」ずに2回以上写真を撮るテクニックがありました。これにより、わずかに異なる時間に撮影された2つの画像がマージされた、いわゆる二重露光を作成できました。その結果、移動したり変化したりした画像の部分がゴースト化したり、暗くなったりすることがよくありました。しかし、画像内の被写体、照明効果、さらには現像プロセスを慎重に制御することで、非常に奇妙な、あるいは「不可能な」写真を作成することが可能になりました。デジタル画像では、画像をさらに細かく制御できるため、さらに簡単です。基本的に…見ていることが信じていることかもしれませんが、カメラは嘘をつきます!たとえば、自分が2回出現する画像が欲しいとしましょう!それは簡単にできます。たとえば、ここに、この例のために特別に三脚とタイマーを使用して撮影した2つのクイック写真のサムネイルがあります。これらを直接使用します。
[IM Output] [IM Output]
より良く、より面白い写真セットを提供していただけませんか?
最高品質の結果を得るために、通常は元の画像ファイルを入力として使用しますが、ここではこれらのサムネイルに二重露光テクニックを直接適用します。古いスタイルのカメラで従来のフィルムのような「二重露光」を使用した場合、結果はこれらの2つの画像の平均になり、自分自身の透き通る「ゴースト」が生成されます。これはこのテクニックのデジタルシミュレーションです…

  magick anthony_1.jpg anthony_2.jpg -evaluate-sequence mean  anthony_ghosts.jpg
[IM Output]
しかし、ゴーストではなく、自分の適切なソリッドイメージが欲しいとしたらどうでしょうか。その場合は、マスクを使用して、どの画像からどの部分を取得するかを選択します。このマスクは2つの方法で生成できます。画像を静止している部分または変化していない部分に沿って分割することにより、マスクを手動で作成することもできます。この特定のケースでは、かなり簡単な問題です…

  magick -size 100x90 xc: -draw 'rectangle 0,0 50,89' \
          -blur 0x3  anthony_mask.jpg
[IM Output]
2つの画像間の切り替えを「フェザー」するために、マスクをぼかしたことに注意してください。そして、ここではマスク付き合成を使用して画像をマージします。

  magick anthony_1.jpg anthony_2.jpg anthony_mask.jpg \
          -composite  anthony_doubled.jpg
[IM Output]
家族写真が2枚(またはそれ以上)あり、一部の人が目を閉じたり、話したり、顔をしかめたり、ただ目をそらしたりしていたとしたらどうでしょうか。異なる画像からそれぞれの「頭」を選択し、複数の画像をマージしてモンタージュを作成することで、すべての人がカメラを見ていて、目が開いている写真を作成できます。入力画像を交換するか、マスクを反転するだけで、画像から自分を完全に削除し、静的な背景の邪魔にならないビューを取得できます。

  magick anthony_2.jpg anthony_1.jpg anthony_mask.jpg \
          -composite  anthony_removed.jpg
[IM Output]
これは、群衆のコントロールに費用をかける余裕がない公共のモニュメントの写真を撮影する場合に便利です。三脚からたくさんの写真を撮るだけで、うまくいけばそれらを組み合わせてシーンからすべての人物を削除できます!何百枚もの画像(ビデオ)を持つ背景画像を生成する代わりに、すべての画像の平均を作成するだけです。これにより、すべての人々またはその他の一時的なオブジェクトが「ゴースト」の薄いもやになります。それはそれ自体で興味深い効果になる可能性がありますが、常に望ましいとは限りません。平均画像はある程度の役に立ちます。なぜなら、平均画像を取得したら、それを個々の画像と比較して、各フレームから人物(一時的なオブジェクト)をマスクアウトしてから、背景を再び組み合わせて、クリーンな(もやのない)背景画像を作成できるからです。ビデオ画像から「クリーンな背景」を自動的に生成することについての主要な議論は、IMディスカッションフォーラムの参照画像の作成変更イベントの抽出にあります。
クリーンな背景写真を使用して、変化した画像の部分をマスクアウトするために、差分画像のしきい値を設定できます。そのマスクを適切に拡張して、画像内のオブジェクトだけでなく、背景の風景に落とす可能性のある影や反射もカバーするために、さらにぼかしとしきい値を使用する必要がある場合があります。正しくするには、多少の試行錯誤が必要になる場合もあります。

  magick anthony_removed.jpg anthony_2.jpg \
          -compose difference -composite \
          -threshold 5% -blur 0x3 -threshold 20% -blur 0x3 \
          anthony_automask.jpg
[IM Output]
では、このマスクを使用して、「ゴースト」画像と元の画像を混ぜ合わせて、そのような「不可能な」画像を作成したために自分の良心によって「悩まされている」ように見せてみましょう。

  magick anthony_1.jpg anthony_ghosts.jpg anthony_mask.jpg \
          -composite  anthony_haunted.jpg
[IM Output]
最後に重要な点として、上記のすべてのテクニックは、写真が固定された三脚にしっかりと固定されたカメラで撮影されたことを前提としています。そうでない場合、手持ちで撮影した場合、どれだけ努力しても画像は一致したり、「整列」したりしません。このような場合は、背景を適切に整列させるために、少なくとも2つの画像のいずれかに、アフィンまたは透視歪みを適用する必要があるかもしれません。背景が複雑になるほど、必要な再調整は厳密になります。フラッシュを使用した場合、または曇りで光の変化がある日だった場合、写真に明るさ調整が必要になることもあります。その原因は、ほとんどのカメラが画像の明るさを「自動調整」するため、フラッシュや光の変化によって、各画像の「自動レベル」調整の処理方法が変わる可能性があるためです。最後の例として、私が作成した別の画像を示します。これは、クライミングウォールの前で、甥が自分自身とフェンシングをしている2枚の写真から作成したものです。カメラを手持ちで撮影し、フラッシュを使用したので、シームレスな結果を得るために、アフィン歪み調整とわずかな明るさ調整を行う必要がありました。
[IM Output]
ヤコブヤコブ
この写真が偽物かどうかを判断しようとする場合、照明、影、反射を確認します。上記では、床をよく見ると、右側の「ヤコブ」には床に適切な反射がありません(写真の端で切り取られています)。しかし、これを知るには、写真をよく研究する必要があります!では、この「二重露光」テクニックをどのように使用できるかを考えてみましょう。面白い鏡などはどうでしょうか。結果をメールで送ってください!さらに詳しく知りたい場合は、研究論文「Interactive Digital Photomontage」で、「二重露光」(または「フォトモンタージュ」)の使用について説明していますが、「画像セグメンテーション」を使用してユーザー選択を拡張し、画像のどの部分がどこから来るかを指定する方法を使用しています。たとえば、大勢の人々の写真がいくつかあり、それぞれの画像で誰かが「良く見えない」とします。このテクニックを使用して、どの画像からどの部分を抽出するかを選択することで、すべての人が正面を向いていて、目が開いていて、笑顔の完璧な集合写真を作成できます!

個人の匿名性を保護する-- 写真の一部をぼかす

3枚の画像の合成マスクを使用する上記のテクニックは、他の方法でも使用できます。たとえば、画像を「ピクセル化」して、マスクを使用して効果を人の顔だけに限定することで、「身元の保護」を行うことができます。

  magick zelda_tn.gif -scale 25%  -scale 400%  zelda_pixelate.gif
  magick zelda_tn.gif -gamma 0 -fill white \
          -draw 'circle 65,53 50,40'   zelda_face_mask.gif
  magick zelda_tn.gif zelda_pixelate.gif zelda_face_mask.gif \
          -composite   zelda_anonymity.png
[IM Output] ==> [IM Output] [IM Output] ==> [IM Output]
もちろん、これらすべてを一度に実行し、ピクセル化された部分から通常の画像への変化を滑らかにすることもできます。たとえば…

  magick zelda_tn.gif \( +clone -scale 25%  -scale 400% \) \
          \( +clone -gamma 0 -fill white \
             -draw 'circle 65,53 50,40' -blur  10x4 \) \
          -composite  zelda_anonymity.jpg
[IM Output]
もちろん、問題のある部分をピクセル化させる代わりに、その領域をぼかすこともできます。2つの「-scale」演算子を1つの「-blur」に置き換えるだけで、詳細をぼかすことができます。このマスクされた領域を置き換えるテクニックは、画像から不要なテキストやロゴを削除するためにも使用できます。詳細は穴埋めを参照してください。

画像にテクスチャを追加する

ハードライトアルファ合成法、またはその他の様々なライティング合成法は、画像にテクスチャパターンを与える方法を提供します。たとえば、ここでは、中国南部昆明動物園で撮影したパゴダの写真に、粗い布地のテクスチャを追加しています。

  magick tile_fabric.gif -colorspace gray  -normalize \
          -fill gray50 +level 35%      texture_fabric.gif
  magick composite texture_fabric.gif  pagoda_sm.jpg \
            -tile   -compose Hardlight    photo_texture.jpg
[IM Output] ==> [IM Output] ==> [IM Output]
画像にテクスチャを実際にタイル状に配置する場合は、「magick composite」コマンドを使用する必要があります。「magick」コマンドの方が汎用性が高いですが、convertを使用してメモリ内で画像をタイル状に配置する他の多くの方法もあります。また、このようにテクスチャを追加する場合、元の画像の細かいディテールは、重ねられたテクスチャの過剰なノイズによって失われる可能性があるため、テクスチャはシンプルにするか、コントラストを低減するレベル調整などを使用して効果を適切に調整する必要があります。画像パターンをテクスチャとして使用する場合は、元の画像で変更されていない領域に完全なグレーの色を使用するように変更する必要があります。つまり、画像の平均色は約50%グレーである必要があります。この例では、ほぼすべてのタイル可能な画像でこれを行うことができる方法の1つを示していますが、この特定の方法が常にうまく機能するとは限りません。このようなテクスチャは、Webページの様々な背景パターンとして、Web全体で見つけることができます。テクスチャのように見えない場合や、カラフルな場合、または非常に明るくても暗くても構いません。ただし、調整後、非常に興味深い効果を得ることができることがわかります。これまでと同様に、適切なマスクを作成することで、画像のどの部分をテクスチャにするかを制限できます。たとえば、パゴダの写真の近くの「白」の空のマスクを作成してみましょう。

  magick pagoda_sm.jpg -fuzz 10% -transparent white \
          -alpha extract -negate  pagoda_mask.png
  magick pagoda_sm.jpg  photo_texture.jpg  pagoda_mask.png \
          -composite  photo_texture_masked.jpg
[IM Output] ==> [IM Output]
ドレスを着た女性の写真を想像してみてください。任意のパターンを入手し、適切にシェードして、元の画像に重ねることで、ドレスをまったく異なるデザインに置き換えることができます。もちろん、最終的な結果を得るには上記の多くのバリエーションがあり、使用する特定のテクニックはユーザー次第ですが、基本的な考え方は同じです。画像にテクスチャを適用し、マスクして結果を重ねます。余談ですが、オーバーレイアルファ合成法も推奨します。これは、ハードライト合成と同じですが、2つの画像を入れ替えたものです。また、画像に様々な方法でテクスチャを適用するために使用できる、他の多くのシェーディング合成法もあります。
[IM Output]

クロマキーマスク-- 特定の色領域による修正

左の写真は、IMフォーラムディスカッションのユーザーから提供されました。彼は、素敵な「ピンク」色の女の子のシャツの色を変更したいと考えていました。問題は、色が単なる「ピンク」ではなく、「ピンク」のさまざまな色合いの範囲であることです。上記のように、画像に変更を加えるには、最初に通常、対象領域の適切なマスクを生成します。ここでは、クロマキーとして知られるテクニックを使用して、特定の色をマスクとして生成します。このテクニックは、一般的に、マスクとして使用する画像内の特定の色を探します。これは、テレビや映画で広く使用されている「青」と「緑」のスクリーン効果にも使用されるテクニックです。
 
これは基本的に、チャンネル画像の分離によって「色相」を抽出し、「色相シェード」を探します。たとえば…

  magick shirt.jpg -colorspace HSL -channel Hue -separate shirt_hue.jpg
しかし、この色相画像にはいくつかの問題があります。
  • まず、「ピンク」の色は「赤」に非常に近く、色相が「ロールオーバー」する分割点にあります。これが問題にならないように、変調を使用して、色相をその色相の「不連続性」から調整します。これは、「緑」または「青」のスクリーンの「クロマキー」を抽出する場合は問題になりません。
  • この「ピンク」の色も、彩度の高い色ではなく、彩度値が非常に低いです。つまり、「色相」は本来あるべきほど強くないということです。
  • もう1つの問題は、灰色の背景です!グレーは色相がほとんどないため、最終マスクから彩度がほとんどない領域を削除する必要があります。そうでないと、背景の色が変わってしまいます。これは、色相ロールへの変更を制限する場合(彩度の低い色には影響しません)は、技術的には必要ありません。
要するに、入力画像は、肌(または髪)の色にあまり似ていない、より明るく鮮やかな色のほうが効果的です。たとえば、鮮やかな青または緑のシャツなどです。しかし、与えられたもので作業します。
[IM Output]
では、2つのチャンネルマスクを抽出して結合しましょう。色相がモジュールを使用して「ロール」された後、色相=Gray64であり、灰色の背景では飽和=黒であることに注意してください。

  magick shirt.jpg -modulate 100,100,33.3  -colorspace HSL \
          -channel Hue,Saturation -separate +channel \
          \( -clone 0 -background none -fuzz 5% +transparent grey64 \) \
          \( -clone 1 -background none -fuzz 10% -transparent black \) \
          -delete 0,1  -alpha extract  -compose multiply -composite \
          shirt_mask.png
残っているのは、いくつかの小さな孤立した「斑点」だけで、形態学的平滑化-morphology Smooth Square)で削除できます。完璧ではありませんが、機能します。より良い方法は、手動でマスクを編集してクリーンアップすることです。マスクは、上記の二重露光匿名性の例で行ったように、合成マスクで使用できます。ただし、マスクを使用して既存の画像を変更する場合(画像の歪みやサイズ変更なし)、書き込み不可の領域を定義するためにマスクを使用する方が簡単です。これらはクリップマスクまたは書き込みマスクとして知られています(「-mask」を参照)。
[IM Output]
ここでは、前のマスクの小さな欠陥をクリーンアップ(オプション)し、それを反転させて「書き込み保護」する領域を定義します。次に、このマスクを設定し、色相をシフトして「ピンク」を「ライトブルー」の色に変え、結果の画像を保存します。

  magick shirt_mask.png -morphology Smooth Square \
          -negate   shirt_write_mask.png

  magick shirt.jpg  -mask shirt_write_mask.png \
          -modulate 100,100,25     +mask shirt_blue.jpg
はい、特に内側の袖にわずかな「ピンク」の境界線があります。また、腕の肌の小さな部分がかなり濃い青色になっています。基本的にこれらはマスクの欠陥であり、マスクをさらに改良することでこれらの問題を修正できます。しかし、悪い結果ではありません。より良いマスクを生成する方法は、はるかに大きく高解像度の画像を使用することです。結果の画像を後でサイズ変更すると、これらの小さな欠陥も(うまくいけば)無視できる程度に小さくなります。
[IM Output]
この特定の例における本当の課題は、「キーカラー」が通常の肌の色に非常に近いことによって、本当に問題を引き起こしているということです!このため、このテクニックを使用する人は、「緑」と「青」のスクリーンを使用します。これらの色は、スクリーンの前にいる人の「肌」の色とできるだけ異なるからです。ソースや作業画像としてJPEGを使用しない方が良いことに注意してください。JPEGは、最終画像でのみ使用する必要があります!これは、そもそも多くの「マスクの欠陥」が生成された理由の一部です。

グリーン画面

今後の例では、「緑のスクリーン背景」のクロマキーマスクを使用します。ウィキペディアの記事クロマキーを拡張したもの。

「グリーン画面」処理における実際の問題は、「カラー・スピル」で、細かい明るい色の髪(ブロンド)や半透明の領域が最悪のカラー・スピル効果を生み出します。

単純なカラー・スピル除去(カラー修正)
g(r,g,b) => (r, min(g, b), b)
アルファの決定…
a(r,b,g) => K0 * b − K1 * g + K2
すべてのK係数に1.0の値を使用するのが、良い最初の推測です。

背景色は既知であり、一度「アルファ」がわかれば、2つの背景を使用した背景除去に示されているテクニックを使用して、最初のカラー式よりも、存在する可能性のある「グリーン画面のハロー」を削除できます。


アーティストのチャコールスケッチ画像

チャコールスケッチ変換を使用すると、画像の簡素化されたグレースケールレンダリングを非常に簡単に生成できます。「混雑した画像」にはうまく機能しませんが、単純な画像には非常に印象的な結果を生み出すことができます。

     magick holocaust_sm.jpg -charcoal 5 charcoal.gif
[IM Output] ==> [IM Output]

子供のための塗り絵の輪郭画像

IMユーザーフォーラムで塗り絵の生成について長い議論が行われた結果、単純な写真を子供たちが色を塗ることができるものに変えるための次のクックブックレシピが開発されました。これが、これまでで最高の結果です。ベルリンのホロコースト記念館で撮影した写真に適用しています。

  magick holocaust_sm.jpg \
          -edge 1 -negate -normalize \
          -colorspace Gray -blur 0x.5 -contrast-stretch 0x50% \
          color-in.gif
  # For heavily shaded pictures...
  #     #-segment 1x1 +dither -colors 2 -edge 1 -negate -normalize \
[IM Output] ==> [IM Output]
上記の試みにおける最終的な操作は、線を滑らかにし、全体的な結果を向上させることです。もちろん、上記の技法は、鮮明な色の変化があり、できれば私が上記で使用したものよりも高解像度の画像の場合にのみ有効です。既に黒のアウトラインと淡色の背景を持つ漫画画像の場合、上記の方法でエッジ検出を使用すると、黒のアウトラインの「二重化」効果が直接生成されます。左下隅にある慰霊碑への道を示すタイルの二重化された線でこの効果を確認できます。これはエッジ検出の動作方法によるアーティファクトであり、IM Examplesの該当セクションでこの例をさらに確認できます。解決策としては、着色領域をアウトライン表示するために「-edge」を使用する前に、このタイプの画像を反転します。

  magick piglet.gif -background white -flatten \
          -colorspace Gray -negate -edge 1 -negate -normalize \
          -threshold 50% -despeckle \
          -blur 0x.5 -contrast-stretch 0x50% \
          color-in_cartoon.gif
[IM Output] ==> [IM Output]
また、「-threshold」を使用して、-edgeが生成しがちな個々の点を削除します。その後、画像内のエイリアシングされた線を再度滑らかにしようとします。上記は、アウトラインを見つけるための合成除算メソッドを使用するために、GIMPフォトコピーフィルターに関する議論に追加されました。

  magick taj_mahal_sm.png -colorspace gray \
          \( +clone -blur 0x2 \) +swap -compose divide -composite \
          -linear-stretch 5%x0%   photocopy.png
[IM Output] ==> [IM Output]
上記の「-linear-stretch」操作は、画像の暗い領域の黒さを調整し、「-blur」のシグマはシェーディングの鮮明さを定義します。

鉛筆スケッチ

Photoshop (PSP) チュートリアル を使用して画像を鉛筆スケッチに変換する方法について、dognoseIMユーザーフォーラム)は、同等のImageMagickコマンドを作成しました。以下は、彼の変換をいくつかのIMコマンドに簡素化したもので、多くの画像を「アーティストの鉛筆スケッチ」形式で一括処理できます。まず、特別な「pencil.gif」画像が必要です。これは時間がかかるため、この例ではサイズを小さくしましたが、より大きな画像全体にタイル化できる機能は維持しています。技法の詳細についてはタイル画像の修正を参照してください。
これは一度だけ行えば、再利用できます。そのため、タイル効果を回避するために、自分の用途に合わせてはるかに大きなものを生成できます。理想的には、変換する画像と同じ大きさにしてください。


magick -size 256x256 xc: +noise Random -virtual-pixel tile \ -motion-blur 0x20+135 -charcoal 1 -resize 50% pencil_tile.gif
[IM Output]
これで、この「鉛筆」シェーディング画像を写真に重ねてブレンドするだけです。鉛筆画像はタイル化されて、処理対象の画像と同じサイズのキャンバスを作成します。次に、タイル化されたキャンバスにある技法を使用して、画像に適用されます。その後、元の画像のグレースケールコピーにマージされます。

     magick pagoda_sm.jpg -colorspace gray \
          \( +clone -tile pencil_tile.gif -draw "color 0,0 reset" \
             +clone +swap -compose color_dodge -composite \) \
          -fx 'u*.2+v*.8' sketch.gif
[IM Output] ==> [IM Output]
composite」コマンドの「-blend」演算子は「magick」コマンドでは使用できないため、DIYの「-fx」演算子を使用して同等の処理を行いました。おそらく、より良い、高速だがより複雑な方法があるでしょう。(ご提案歓迎です)これは最終版ではなく、演算子は画像内のより明るいものの鮮明な色の変化の一部をアウトライン表示するために必要なエッジ強調の側面を一部欠いています。上記を改善できますか?上記のアルゴリズムは、ImageMagickに「-sketch」というアーティスティックな変換として組み込まれていましたが、「-resize」による生成された「鉛筆タイル」の平滑化はありませんでした…


magick pagoda_sm.jpg -colorspace gray -sketch 0x20+120 sketch_new.gif
[IM Output] ==> [IM Output]

ヴィネット除去

写真を撮影する場合(デジタルかそうでないかに関わらず)、カメラレンズは一般的に画像のエッジとコーナーを暗くします。これは「ヴィネット」と呼ばれます。「-vignette」演算子を使用して、意図的にこのレンズ効果を偽造することがよくあります。ヴィネット変換を参照してください。Martin Herrmann は、写真からカメラのヴィネットを除去したいと考えていました。基本的に、彼はフラッシュを使用せずに明るい光の中で白い紙の写真を撮影しました。その後、彼はこれを実際の写真と組み合わせて、画像のエッジとコーナーを適切に明るくしたいと考えました。基本的に、私たちが行いたいことは、元の画像を明るく照らされた白い紙の写真のグレースケール画像で除算することです。そうすると、画像の部分が「白い紙」の写真が暗くなった量だけ明るくなります。これは基本的に、「除算」という合成メソッドで、「ソース」画像を「背景」画像で除算します。例えば、

  magick nikon18-70dx_18mm_f3.5.jpg  vegas_orig.jpg \
          -compose Divide -composite  vegas_fixed.jpg
[photo]  + [photo] ==> [photo]
(クリックして大きな写真を見る)
しかし、「白い紙」の写真は真の白ではない可能性があり、この「オフホワイト」の色で画像を明るくしたくない可能性があります。これを修正するために、除算画像に中心ピクセルの色を乗算する必要があります。これがMartinに提供された最終的な解決策で、非常に遅いFX DIY演算子を使用していました。除算合成メソッドが追加される前に作成されたもので、これを使用すると、このプロセスを大幅に高速化できます。白い写真は、色の歪みを除去するためにグレースケールにも変換されました。元の画像(この場合は「出力」画像)を維持するためにも順序を変更したことに注意してください。

  magick vegas_orig.jpg \( nikon18-70dx_18mm_f3.5.jpg -colorspace Gray \) \
          -fx '(u/v)*v.p{w/2,h/2}'   vegas_fixed_fx.jpg
[photo]
拡大した写真、特に左上隅と右上隅の「空」のコーナーをよく見ると、ヴィネット効果とその修正を確認できます。完璧な解決策ではなく、もう少し微調整が必要です。たとえば、スケーリングピクセルを使用する代わりに、「白いページ」画像を前処理し、より良いヴィネット除去結果に合わせて調整できます。JPEG形式は、アーティファクトや不整合が結果に発生する可能性があるため、写真作業にはお勧めできません。この形式は、最終結果の保存と表示にのみ適しています。ヴィネット修正に関する主要な議論は、IMユーザーフォーラムの議論Algorithmic vignetting correction for pinhole cameras?にあります。ヴィネットに影響を与える可能性のあるものには…
  • レンズからのフィルムの距離。離れるほど光の広がりが大きくなります。
  • 光の角度による開口部の「円形」(レンズまたはピンホール)の面積。
  • 開口部の周りのカメラ材料の配置。たとえば、レンズホルダーやピンホールの厚さ。