ImageMagick 使用例 -- デジタル写真の取り扱い
- 露出不足の写真を明るくする
-
ビニング - デジタルノイズの低減 (作成中)
-
わずかな回転補正 - 水平でない写真を直す
- ティルトシフト効果 - 風景を人工的なミニチュアのように見せる
- PNG-JPEG レイヤー画像 - 文字をくっきり保ったままページを圧縮する
- 写真の重ね合わせ - 連結した写真をぼかしながら重ねる
- 二重露光 - 同じ場面の複数の写真を混ぜ合わせる
- 人物の匿名性を守る - 写真の一部をぼかす
- 画像にテクスチャを加える
- クロマキー・マスキング - 特定色の領域単位での加工
- 子供向け塗り絵画像
- 鉛筆スケッチ
- 周辺減光(ビネット)の除去
ImageMagick の主要な用途のひとつは、最新のデジタルカメラで撮影した写真の取り扱いと加工です。これらのカメラは一般に、かなり大きく高解像度の写真を撮影し、その中に時刻、縮尺、ズーム、カメラ、向きなどのメタデータを含めます。カメラを携帯電話と連携させ、写真を撮ったときにあなたがどこにいたか、そして(前にどんな携帯電話があるかから)誰が写っているかまで推測させようという計画もあります。ここでは、デジタル写真を扱う基本と、芸術的なレンダリングなど他の目的への変換まで見ていきます。デジタルカメラ利用者である Walter Dnes 氏には、デジタル写真の強調に関するご協力に特に感謝します。
デジタルカメラのメタデータ、EXIF プロファイル
デジタルカメラで写真を撮ると、JPEG 保存ファイルに多くの追加情報も含まれます。このメタデータは EXIF プロファイルとして知られ、特に写真ラボや現像のために用意されたものです。ImageMagick の「magick identify」を「[-verbose](https://imagemagick.org/command-line-options/#verbose)」設定で使うと、この Exif 情報が表示されます。以下は、私が中国南部の昆明動物園で撮ったパゴダ(仏塔)の写真の EXIF データです。
magick identify -format "%[EXIF:*]" pagoda_sm.jpg |\
sed 's/\(.\{46\}\).*/\1/' | column -c 110
| EXIF データ、あるいは identify の出力全般は、大文字小文字を区別しない方法で処理すべきです。たとえば古いバージョンの IM の多くは、「exif:」(小文字)ではなく「EXIF:」(大文字)と出力します。
---|---
以下は似た例ですが、'globbing'(シェル風)の式を使って、出力を Time を含む EXIF フィールドに限定しています...
magick identify -format "%[exif:*time*]" pagoda_sm.jpg
この写真について EXIF プロファイルには多くの情報があります。たとえば
- 私のカメラは Panasonic('
Make')の DMC-LZ1('Model')です。 - カメラは回転されていました('
Orientation')。しかし私は EXIF データを調整せずにその回転を補正したに違いありません。カメラはわずかに上向きにも傾いていましたが、その情報は記録されていません。 - '
FocalLength' が '37mm' であることから、カメラの「光学ズーム」機能を使わなかったことがわかります。私のカメラは最大 6 倍の光学ズームが可能で、'FocalLength' は '366/10'、すなわち '222mm' まで対応します。 - そして '
DigitalZoomRatio' は、デジタルズームも使わなかったことを示しています。 - カメラはまた、速い 1/8 秒の '
ExposureTime'、絞り 'MaxApertureValue' が 3mm、すなわち 'FNumber' が '5.6'、'ISOSpeedRating' が '64' を使いました。 - フラッシュ('
LightSource')は使われませんでした。 - 元の画像は 1728 × 2304 ピクセル('
ExifImageLength' と 'ExifImageWidth')でした。ただし実際の画像は、確認していただければわかるように、より小さいので、私は切り抜きおよび/またはリサイズを行ったに違いありません。 - そしておそらく最も重要なのは、'
DateTime' 文字列によれば、2005 年 7 月 9 日の 14:05 ごろに撮影されたということです。これはカメラの時刻を正しく設定していたことを前提とします(実際に設定していました)。 - より新しいカメラは GPS の位置情報や、場合によっては視線方向のコンパス方位まで持っているかもしれません!
また上には挙げていませんが、カメラが自身の表示画面で使った小さな「サムネイル」プレビュー画像も含まれています。さらに、写真ラボのプリンターで「現像」または印刷したい写真をマークしたり、その他の印刷パラメータを調整したりする機能もあります。しかしこれはほとんどの人にはまず使われません。これらの設定の多くは利用者にとって非常に有用ですが、人々にとって最も有用なのは一般に写真の日付と時刻です。これはもちろん、写真を撮る前にカメラの日付と時刻が正しく設定されていたことを前提とします。また多くの人は、表示時に正しく回転できるよう画像の向きにも関心があります。次に見ていくのがまさにそれです。これらすべてのデータ、特にプレビュー画像は、画像の中でかなりの容量を占めることがあります。そして、私が 2005 年 7 月に中国の昆明にいたことを世界中の誰もが知ることを、私が実際には望まないかもしれません。そのため、画像を実際にワールドワイドウェブ上に公開する前に、EXIF データを取り除きたいと思うかもしれません。また、デジタルカメラの画像のサイズは通常非常に大きく(そしてますます大きくなっており)、写真品質で印刷できる一方で、WWW で使うには大きすぎ、特にサムネイルには向きません。そのため、利用者に実際に写真品質の画像を印刷できるようにしたいのでなければ、元画像をそのまま公開することはしないでしょう。たとえば上の画像は IM 使用例向けに切り抜きとリサイズをしてありますが、例のために意図的に EXIF データはそのまま残しました。通常はこの情報を取り除きます。
デジタル写真の向き
Photoshop は EXIF の 'Orientation' 設定に基づいてデジタル画像を自動的に回転すると聞いています。IM も、画像を読み込んだ後に「[-auto-orient](https://imagemagick.org/command-line-options/#auto-orient)」演算子を含めることでこれを行えます。ただし、これは重要なのですが
JPEG 形式は非可逆(ロッシー)
これが意味するのは、JPEG ファイル形式をデコードして保存するたびに、画像がわずかに劣化するということです。汎用の画像処理系として、IM は常に形式を完全にデコードして再エンコードするため、画像を保存し直すたびに必ず JPEG 画像を劣化させます。JPEG 形式の性質についての詳細は JPEG 画像ファイル形式 を参照してください。要点は、デジタル写真の向きを補正するために IM(「[-auto-orient](https://imagemagick.org/command-line-options/#auto-orient)」を使う)を使うのは、サムネイル作成、画像への注釈付け、透かし入れ、あるいは露出調整など、他の画像変更操作も同時に行うときだけにする、ということです。IM は画像プロパティのエスケープを使って、写真から現在の向き(数値として)を取り出せます... | |
magick identify -format '%[exif:orientation]' pagoda_sm.jpg
![[IM Text]](../static/img/photos/orient_show.txt.gif)
IM は特別な「[-orient](https://imagemagick.org/command-line-options/#orient)」演算子を提供しています(取りうる値を見るには「[-list](https://imagemagick.org/command-line-options/#list) orientation」を使ってください)。 | |
magick pagoda_sm.jpg -orient bottom-right \
-format '%[exif:orientation]' info:
![[IM Text]](../static/img/photos/orient_setting.txt.gif)
これらのメタデータ設定方法を使えば、加工した写真、特に回転した写真の向きを調整できます。正しく向きが整った写真は向きが 'Top-Left'、すなわち 1 であることに注意してください。もちろん、後の画像処理で「[-auto-orient](https://imagemagick.org/command-line-options/#auto-orient)」を使うつもりなら、(「[-strip](https://imagemagick.org/command-line-options/#strip)」や「[-thumbnail](https://imagemagick.org/command-line-options/#thumbnail)」で)EXIF メタデータを取り除いてはいけません。画像のメタデータを取り除く前に使ってください。もし画像を劣化させたり他の変更を加えたりせずに写真の向きを補正したいなら、JHead プログラムの利用をお勧めします。たとえばここでは、あるディレクトリ内のすべてのデジタル写真について、写真の向きを補正し、内蔵のプレビューサムネイルを削除しています。
jhead -autorot *.jpg
| _JPEG の可逆回転は、サイズが 8 または 16 で割り切れる画像でのみ正しく機能します。これはほとんどの(ただし全部ではない)デジタルカメラ写真に当てはまります。半端なサイズの画像でこれを試すと、右端や下端のブロック(半端なサイズを含む部分)が最終画像で正しく配置されません。これらのブロックは右端または下端にしか存在できないからです。
この例については、この具体的な議論を参照してください。_
---|---
JHead プログラムでは、写真の日付調整(カメラの時刻設定が間違っていた場合や、別のタイムゾーンへ移動した場合)、プレビューサムネイルの抽出/削除/差し替え、画像のコメントフィールドの設定、photoshop プロファイルの削除、そして基本的な画像の切り抜き(写真に映り込んだ見知らぬ人を消すなど ;-) などを、JPEG 画像データを劣化させずに行えます。この情報を直すには、このプログラム、または同種の他のプログラム(その他の JPEG 処理プログラムを参照)をお勧めします。ただし、JPEG 画像データを実際にデコード/再エンコードしないものを選んでください。向きについて最後にひとつ。カメラをほぼ真上または真下に向けると、EXIF の向き設定が正しく解決されないことがあります。斜めや傾いた撮影でも同様です。向き(そしてカメラ)は、こうした状況に対する感覚を持っていないのです。そのような写真では、低レベルで非可逆でない「jpegtrans」や IM の「[-rotate](https://imagemagick.org/command-line-options/#rotate)」を使って自分で回転を行い、その後 EXIF の向き設定をリセットする(JHead または IM の「[-orient](https://imagemagick.org/command-line-options/#orient)」演算子を使う)か、あるいは EXIF プロファイルを取り除くしかありません。
その他の IM 非可逆変更...
もし画像のリサイズや、ウェブ用に品質とサイズを落とすなど、ほかの変更も
行っているなら、データの損失はすでに既定の事実です。
そのため、それらの操作中に IM は同様のことを行え、必要なすべての操作を
単一の「読み込み・保存」サイクルで行えます。
すべての画像を横向きへ回転 -rotate 90\<
縦向きへ -rotate -90\>
色の改善
進む前に、まず使用する一般的な色調整手法の入門として 色の調整 を見ておくことをお勧めします。高コントラストの線画やグラフィックスを(「[-normalize](https://imagemagick.org/command-line-options/#normalize)」を使って)正規化(Normalize)するのは素晴らしい効果があります。しかし正規化された写真は不自然に見えることがあり、さきほど述べたように、うまく印刷できないこともあります。「[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)」演算子は正規化の「境界」を制限できますが、「[-levels](https://imagemagick.org/command-line-options/#levels)」や/または「[-sigmoidal-contrast](https://imagemagick.org/command-line-options/#sigmoidal-contrast)」演算子はより「滑らかな」調整ができます(これらの演算子が何をするかの低レベルな解説は ヒストグラム調整 を参照してください)。上の入力画像は IM メーリングリストの「Tong」氏のご厚意によります。
露出不足の写真を明るくする Walter Dnes 寄稿
適切な露出を得るのに十分な光が単純に得られないこともあります。また、動きによるブレを抑えるために、最適より短い露出時間を使わざるを得ないこともあります。露出不足のデジタル写真は、「[-sigmoidal-contrast](https://imagemagick.org/command-line-options/#sigmoidal-contrast)」演算子をしきい値 '0%' で使うことで、ハイライトを飛ばさずに暗い領域を優先的に明るくできます。詳細は シグモイド非線形コントラスト を参照してください。以下は軽い露出不足の例で、日没後の無料コンサートで撮影しました。明るく照らされた領域が多くあり、それらは鮮明ですが、もっと見えるようにしたい暗い領域もあります。
magick night_club_orig.jpg -sigmoidal-contrast 4,0% night_club_fixed.jpg
| _いつものとおり、中間作業には TIFF や PNG などの非可逆でない形式を使うべきです。ここで JPEG 形式を使っているのは、ウェブ公開のためにディスク容量とダウンロード帯域を節約するためにすぎません。
画像を選択すると、表示されている小さなサムネイルではなく、例で実際に使われている拡大版が見られます。_
---|---
そして以下は大きく露出不足の例で、私のバルコニーから南へトロント市街を望んだ夜景の撮影です。
magick night_scape_orig.jpg -sigmoidal-contrast 10,0% night_scape_fixed.jpg
主パラメータは明るくする量を制御します。明るくする度合いが大きいほど高い値を使います。そして出力画像はよりざらついて見えます。これは、小さなピクセル誤差も同時に強調されるためです。シグモイドコントラストによる明るくしは、スペクトルの赤端を弱める傾向があります。結局のところ、本当に求める明るさのレベルではなく、最も自然な肌色になるパラメータを選ばざるを得ないかもしれません。大きく露出不足の場合は、明るくした後に、ざらついた白黒画像をもっともらしく仕上げたものになってしまうでしょう。これはデジタル画像強調の物理的な限界です。色のデータが存在しなければ、IM はそれを生成してくれません。実際には、私のバルコニーの右側のレンガは赤みがかっていて、下の木々は緑色です。
ビニング -- デジタルノイズの低減 Walter Dnes 寄稿
多くの真剣な写真家は、デジタルカメラメーカーによる「メガピクセル競争」の副作用に不満を抱いています。メーカーは画素を小さくすることで、より多くのメガピクセルをデジタルカメラのセンサーに詰め込みます。画素が小さいと、同じ ISO 設定でよりノイズの多い写真になり、それが人々により低い ISO 設定の使用を強います。ノイズを避けるために低い ISO 感度を使うには、より長い露出時間が必要になります。これが結果として、ほとんどの民生用デジタルカメラは、三脚に固定したカメラで撮る静物以外では、内蔵フラッシュの届く約 10 フィートの範囲を超えると屋内で実質的に使い物にならない、ということを意味します。多くのデジタルカメラ利用者は、より高い ISO 設定でノイズの少ない写真を得るために、画素をいくらか手放しても構わないと思っていますが、会社を支配するマーケターはこれを選択肢として考慮することを拒みます。幸い、このトレードオフはデジタル写真に対して事後的に行えます。技術用語では「ビニング」と言います。簡略化した理論はこうです...
- n × n の画素グリッドを取り、その成分を平均して 1 つの「スーパーピクセル」を得る。
- 信号は結合された画素面積に比例するので、信号の量は n^2 倍に増える。
- ノイズはランダムである。つまり結合された画素面積の平方根に比例し、n 倍になる。正味の結果として、SNR(信号対雑音比)が n 倍に向上する。詳細は 写真用語集、ビニング を参照してください。
| 1600×1200 のデジタル写真を 800×600 にビニングする(つまり 2×2 グリッド)と、信号対雑音比は 2 倍になります。同様に、2560×1920 の写真を 3×3 で 853×640 ピクセルにビニングすると、信号対雑音比が 3 倍に改善します。 | ビニングを利用するには、写真画像が最終的な目的サイズの整数倍でなければなりません。 |
|---|---|
ImageMagick では、特別な「[-filter](https://imagemagick.org/command-line-options/#filter)」設定 'box' により、画像を「[-resize](https://imagemagick.org/command-line-options/#resize)」するときに画素のグループを 1 つの画素へ平均します(詳細は リサンプリングフィルター を参照)。つまり「ビニング」を行うには、画像を正しくリサイズするだけでよいのです。 |
作成中
Walter Dnes 氏は、計算を行い、画像を最小限に切り抜いて「ビニング」を実行する元のスクリプト binn も提供してくれました。ビニング例 3ビニング例 4
写真変換クックブック
わずかな回転補正 -- 写真をより水平にする
よくある状況です。写真を撮ったのに、画像が水平でなく、それを直したい。
たとえば以下は、2008 年に北京で、紫禁城のすぐ後ろにある景山公園の丘から、手持ちカメラで撮った写真です。いいえ、紫禁城そのものではなく、丘の反対側にある寺院です。拡大画像を見るにはサムネイルをクリックしてください。 そう、この画像は小さく、解決策は小さなサムネイルではなく元画像に適用すべきですが、手法はどの画像でも同じです。この場合、補正するには画像を -1.8 度回転させる必要があります。さて、単純に画像を回転すると、わずかに大きな画像になり、四隅に色の領域が入って、補正が露骨でひどく見えてしまいます。 |
magick beijing_tn.png -rotate -1.95 beijing_rotate.png
簡単な画像の回転で示したように、画像を元のサイズに切り戻したとしても、依然として色付きの隅が残ります。 ![[IM Output]](../static/img/photos/beijing_rotate.png)
最も単純な解決策は、その結果を切り抜いてこれらの縁を取り除くことですが、すると画像はかなり半端なサイズになり、これもまた何か手が加えられたことが露骨にわかってしまいます。そのクリッピングを行う数式は単純ではありませんが、ゆがみによる回転手法で示されています。よりよい解決策は、画像を回転するだけでなく、わずかに拡大して、元と同じサイズの回転画像を作ることです。 |
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]](../static/img/photos/beijing_rot_correction.png)
そして画像はきれいで、壁は完璧に水平になりました。角度の計算は、画像内の長い直線の両端のピクセル位置を使った、比較的単純な三角法です。ただし私は、さまざまな小さな角度で試行錯誤しながら画像を回転するだけで、よい回転角度を比較的すばやく見つけられることに気づきました。ある角度がどれくらいよいかを見るときは、使っている線や縁に沿ったピクセルを非常に近くまでズームして見てください。この写真では壁の上端です。そして画像の回転では、左回り(反時計回り)の回転が負であることを覚えておいてください(Y 軸が下向きを指しているため)。また、可能な限り常に元画像に操作を適用し、中間画像(特に中間 JPEG 画像)の使用を避けることを覚えておいてください。どんな写真の加工も、保存された中間コピーからより、元のソースから始めて適用するほうが常に優れています。
ティルトシフト効果 -- 風景を人工的なミニチュアのように見せる
「ティルトシフト」は、画像の上部と下部をぼかしつつ、画像の中央をぼかさずに残す手法です。元々は、レンズを傾けて画像の上部と下部を焦点から外すことで、非常に古い蛇腹式カメラで行われていました。ImageMagick の v6.5.4-0 で追加された 可変ぼかしマッピング のおかげで、今では簡単に行えます。これに加えて、影を強調するために非常に高いコントラストをかけ、色を彩度を上げると、典型的な結果として、普通の画像を人工的に見せられます。まるで小さくて非常に細かく作り込まれ、明るく照らされたミニチュアの写真を撮っているかのようにです。
最初に行う必要があるのは、画像内の色を強調して非常に高いコントラストにし、さらにおそらく少し明るくして、強いスタジオ照明でとてもよく照らされているように見せることです。 |
magick beijing_md.jpg -sigmoidal-contrast 15x30% beijing_contrast.jpg
![[IM Output]](../static/img/photos/beijing_contrast_tn.gif)
これらの色効果を得るために、強い シグモイドコントラスト操作 を使った点に注目してください。画像の最も明るい色と最も暗い色を「クリップ」したくなかったので、私がしたように単純な線形コントラストは使いませんでした。コントラスト値 '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]](../static/img/photos/beijing_blurmap_tn.gif)
画像全体に線形グラデーションを生成するために、元画像そのものと 2 点の 重心座標スパースカラーリング を使った点に注目してください。その線形グラデーションは次に、基本的な 多項式関数 を使って加工され、中央が黒の放物線状グラデーションになります。あとは、ぼかしマップに従って画像をぼかし、「ティルトシフト」効果を作るだけです。結果として、元画像は実物のさっと撮ったスナップ写真というより、縮尺ミニチュアのように見えます。
magick beijing_contrast.jpg beijing_blurmap.jpg \
-compose Blur -set option:compose:args 10 -composite \
beijing_model.jpg
最終画像でわかるように、木々と建物は、強い色のおかげで非常に人工的に見え、一方で近くと遠くの部分のぼかしが、画像に「小さな」ミニチュアらしい感じを与えています。ただし、これはかなり細かく作り込まれたミニチュアだったに違いありません! ティルトシフト処理の一部として 回転補正(前述)を行えば、結果はさらに改善できたでしょう。完璧なカメラの向きは、単に人工的な感じを足すだけです。もちろん、これらの操作をすべてつなげて 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 のところで水平にしました。ただし、線形グラデーションでは焦点の合う領域が小さすぎてあまり実用的でないと私は感じます。ティルトシフト効果に適したグラデーションを生成する方法は、ほかにもたくさんあります。たとえば リサイズしたグラデーション を使う方法です。あるいは、1 列のピクセルの シェパーズ・スパースカラー を水平方向にスケーリングする方法です。サインカーブのグラデーションも有用かもしれません。
速度の最適化
可変ぼかしマッピング 操作は、本質的に単一パスの 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)に保たれることです。馬鹿げて奇妙に聞こえますが、実際に本当です。分けた画像は、1 つに合わせた画像が使う 3〜4 倍のディスク容量を節約できます。通常、この 2 つの画像は出版工程で別々のレイヤーとして生成されます。しかし、事後的に画像を分けることもできます。画像は単に重ね合わせるだけです...
magick ny_family.jpg ny_family.png -composite ny_family_merged.jpg
これは通常の オーバー合成 を使っており、PNG(オーバーレイ)画像が透明である必要があります。この透明性には 2 つの形態があります。上の例で見たような、ブール値(純粋なオン/オフ)のマスクが 1 つの形です。画像分離のサンプルコードを歓迎します。
写真の重ね合わせ -- 連結した写真をぼかしながら重ねる
一連の重なり合う写真を作る(これはパノラマの意味ではありません)のはよくある作業で、特にウェブサイト作成においてです。しかし、IM 演算子に関する適切な知識がなければ、これは手こずることがあります。最も単純な方法は、2 つの画像の マスク合成 と、どちらの画像を重ねるかを選ぶマスクを使うことです。しかしまず簡単な計算が必要です。この例では、120×90 ピクセルのサムネイル画像を 2 つ使い、それらを水平方向に 40 ピクセル重ねたいとします。これは、結果の画像が幅 120 + 120 - 40 ピクセル、すなわち 200×90 ピクセルの画像になるべきだということです。次にマスクが必要です。これは片側が黒、もう片側が白で、中央に 40 ピクセルのグラデーションがあり、最終出力画像のサイズである必要があります。つまり、120 ピクセル - 40 ピクセルで、2 つの重ならない領域それぞれに 80 ピクセルの領域が得られます。ではマスク画像を生成しましょう... |
magick -size 90x80 xc:white xc:black -size 90x40 gradient: \
+swap -append -rotate 90 overlap_mask.png
![[IM Output]](../static/img/photos/overlap_mask.png)
マスク画像を生成する別の方法は、Fred Weinhaus 氏の「[plmlut](http://www.fmwconcepts.com/imagemagick/plmlut/index.php)」水平グラデーション生成スクリプトを使うことです。これは、上で私が生成した急な線形グラデーションよりも、グラデーションの曲率についてより細かい制御ができます。さて、計算がすべて片付いたので、あとは、先ほど生成したマスクを使って 3 画像のマスク合成を行うだけです。ただし、重なる右側の画像(任意の色)に十分なスペースを与えるために、移動先(左側)の画像を拡張し、適切な gravity(右、すなわち 'East')を使って 2 番目の画像を正しく配置する必要もあります。
magick holocaust_tn.gif -extent 200x90 spiral_stairs_tn.gif \
overlap_mask.png -gravity East -composite overlap_photos.jpg
そして今、線形グラデーションを使って重ね合わされた 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]](../static/img/photos/overlap_angled.jpg)
そう、上はかなり複雑ですが、何が可能かを示しています。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
重なり合うマスク画像の位置をあらかじめ計算する代わりに、連結による重ね合わせ や、より長い画像列向けの 逐次計算される位置 で見られる手法を使えます。最後の注意点: このような写真の重ね合わせは、全体的に共通の色がそれなりにある画像で最もうまくいきます。また、列の両端の画像では、画像の片側だけで重なりが生じるため、中央に配置された被写体があまり中央に見えないことに気づくかもしれません。この問題は、それらの画像の外側の縁を透明にフェードさせるか、外側の縁を少し切り落として被写体を再び中央に寄せるのを助けることで、改善できます。余談: 異なる色空間で合成を行うとよりうまくいくかもしれません。どなたか実験して、結果が良いものでも悪いものでも報告してくださいませんか?
二重露光 -- 同じ場面の複数の写真を混ぜ合わせる
昔のフィルム式カメラには、フィルムを「巻かず」に 1 枚の写真を 2 回以上撮る手法がありました。これにより、二重露光として知られるものを作れました。わずかに異なる時刻に撮られた 2 つの画像が混ぜ合わされるのです。その結果はしばしば、動いたり変化したりした画像の部分のゴーストやかすみでした。しかし、画像内の被写体、照明効果、さらには現像工程を注意深く制御することで、非常に奇妙な、あるいは「あり得ない」写真さえ作ることが可能になりました。デジタル画像では、画像をさらに良く制御できるので、いっそう簡単です。基本的に... 見ることは信じることかもしれないが、カメラは嘘をつく! たとえば、自分が 2 回登場する画像が欲しいとします。それは簡単に行えます。たとえば以下は、私がこの例のために、三脚とタイマーを使ってさっと撮った 2 枚の写真のサムネイルで、これをそのまま使います。
二重露光の手法をこれらのサムネイルに直接適用しますが、より一般的には、最高品質の結果を得るために、元の画像ファイルを入力として使ってこれを行います。さて、もし古いスタイルのカメラで伝統的なフィルム風の「二重露光」を使ったなら、結果はこれら 2 つの画像の平均となり、透けて見える自分の「ゴースト」が生成されます。以下はこの手法のデジタルシミュレーションです... |
magick anthony_1.jpg anthony_2.jpg -evaluate-sequence mean anthony_ghosts.jpg
![[IM Output]](../static/img/photos/anthony_ghosts.jpg)
しかし、ゴーストではなく、自分のしっかりした実体の画像が欲しい場合はどうでしょう。その場合は、どの部分をどの画像から取るかを選ぶためにマスクを使う必要があります。このマスクは 2 通りの方法で生成できます。静的な、すなわち変化しない部分に沿って画像を分けることで、手動でマスクを作るだけでもよいのです。この特定の場合はかなり単純な作業です... |
magick -size 100x90 xc: -draw 'rectangle 0,0 50,89' \
-blur 0x3 anthony_mask.jpg
![[IM Output]](../static/img/photos/anthony_mask.jpg)
2 つの画像間の切り替わりを「ぼかして馴染ませる(feather)」ために、マスクをぼかした点に注目してください。そしてここでは、画像を混ぜ合わせるために マスク合成 を使います。 |
magick anthony_1.jpg anthony_2.jpg anthony_mask.jpg \
-composite anthony_doubled.jpg
![[IM Output]](../static/img/photos/anthony_doubled.jpg)
2 枚(以上)の家族写真があって、ある人は目を閉じていたり、話していたり、変な顔をしていたり、よそを見ていたりするとします。各「頭」を異なる画像から選び取り、複数の画像を混ぜ合わせてモンタージュを作れば、全員がカメラを見て目を開けている写真を得られます。入力画像を入れ替えるか、単にマスクを反転するだけで、画像から自分を完全に取り除き、静的な背景の遮るもののない眺めを得られます。 |
magick anthony_2.jpg anthony_1.jpg anthony_mask.jpg \
-composite anthony_removed.jpg
![[IM Output]](../static/img/photos/anthony_removed.jpg)
これは、群衆整理の費用をかけられない公共の記念碑の写真を撮るときに便利です。三脚から、たくさん、たくさん写真を撮ればよいのです。そうすればうまくいけば、それらを組み合わせて場面から全員を取り除けます! 何百枚もの画像(動画)がある場合の背景画像生成の代替策は、すべての画像の平均を作るだけというものです。これは、すべての人やその他の一時的な物体を、薄い「ゴースト」のかすみに変えます。それはそれ自体で興味深い効果になり得ますが、常に望むものとは限りません。平均画像は有用な一段階になり得ます。一度それを得れば、各個別画像と比較して各フレームから人物(一時的な物体)をマスクで取り除き、再び背景同士を組み合わせて、(かすみのない)きれいな背景画像を作れるからです。動画画像から「きれいな背景」を自動生成することについての大きな議論は、IM ディスカッションフォーラムの 参照画像の作成 と 変化イベントの抽出 にあります。
きれいな背景写真があれば、差分画像をしきい値処理して、変化した画像の部分をマスクで取り除けます。物体だけでなく、それが背景の風景に落とすかもしれない影や反射も覆えるよう、そのマスクを適切に広げるために、さらにぼかしとしきい値処理を使う必要があるかもしれません。正しく仕上げるには、いくらかの試行錯誤も必要かもしれません。 |
magick anthony_removed.jpg anthony_2.jpg \
-compose difference -composite \
-threshold 5% -blur 0x3 -threshold 20% -blur 0x3 \
anthony_automask.jpg
![[IM Output]](../static/img/photos/anthony_automask.jpg)
さて、このマスクを使って、自分の「ゴースト」画像を元画像と混ぜ合わせ、こんな「あり得ない」写真を作ったことで自分の良心が私に「取り憑いている」ように見せましょう。 |
magick anthony_1.jpg anthony_ghosts.jpg anthony_mask.jpg \
-composite anthony_haunted.jpg
![[IM Output]](../static/img/photos/anthony_haunted.jpg)
最後の点として、上のすべての手法は、写真が静止した三脚にしっかり固定されたカメラから撮られたことを前提としています。そうでなく、単に手持ちの位置から撮ったのであれば、どれだけ頑張ってやろうとしても、画像は正しく一致または「整列」しないことを保証します。そのような場合は、背景を正しく整列させるために、2 つの画像のうち少なくとも一方に、いくらかの アフィン 変形、あるいは パースペクティブ 変形さえ必要になるかもしれません。背景が複雑であるほど、必要な再整列は厳密になります。フラッシュを使った場合や、変わりやすい光の曇りの日だった場合は、写真にいくらかの明るさ調整も必要になるかもしれません。原因は、ほとんどのカメラが画像の明るさを「自動調整」することで、フラッシュや変わりやすい光が、画像 1 枚 1 枚に対する「自動レベル」調整の扱いを変えてしまうためです。最後の例として、ここに私が 2 枚の別々の写真から作った別の画像があります。クライミングウォールの前で、甥が自分自身とフェンシングをしているものです。私はカメラを手で持ち、フラッシュを使ったので、見ての通りの継ぎ目のない結果を得るために、いくらかのアフィン変形調整と、わずかな明るさ調整が必要でした。
この写真が偽物かどうかを判断しようとするなら、照明、影、反射を見るでしょう。上の例では、床を詳しく調べると、右の「Jacob」が床に適切な反射を持っていない(写真の縁で切れていた)ことがわかります。しかし、それに気づくには写真をよく研究する必要があるでしょう! さて、この「二重露光」手法を何に使えるか考えてみてください。たとえば おもしろい鏡 はどうでしょう。あなたの結果を私にメールしてください! もしさらに深く入り込みたいなら、研究論文 「インタラクティブ・デジタル・フォトモンタージュ」 は、「二重露光」(同論文で言うところの「フォトモンタージュ」)の利用に踏み込んでいますが、「画像セグメンテーション」で拡張されたユーザー選択を活用して、画像のどの部分をどこから取るかを選びます。一例として、大きな集団の人々の写真が何枚もあり、各写真で誰かが「よく写っていない」場合です。この手法を使って、どの人がどの画像から来るかを選べば、全員が正面を向き、目を開け、笑っている完璧な集合写真を得られます。
人物の匿名性を守る -- 写真の一部をぼかす
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
もちろん、これをすべて一度に行うこともでき、ピクセル化から通常への変化を滑らかにすることさえできます。たとえば.. |
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]](../static/img/photos/zelda_anonymity.jpg)
もちろん、問題の部分をピクセル化する代わりに、その領域をぼかすこともできます。2 つの「[-scale](https://imagemagick.org/command-line-options/#scale)」演算子を単一の「[-blur](https://imagemagick.org/command-line-options/#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
実際にテクスチャを画像上に_タイル状に敷き詰めたい_場合は、より汎用的な「magick」コマンドではなく「magick composite」コマンドを使う必要がある点に注意してください。ただし、convert を使って メモリ内で画像をタイル状に敷き詰める 方法は他にもいくつかあります。また、このようにテクスチャを加えると、重ねたテクスチャの過剰なノイズによって元の写真の細部が失われることがある点にも注意してください。テクスチャは単純なものにするか、上で使った コントラストを下げるレベル調整 のようにその効果を適切に抑えるべきです。画像パターンをテクスチャとして使うには、元画像で変化しない領域に完全なグレー色が使われるよう加工すべきです。つまり、画像の平均色がおよそ 50% グレーであるべきです。例では、ほぼどんなタイル可能な画像でもこれを行える方法の 1 つを示していますが、この特定の方法が常にうまくいくとは限りません。そのようなテクスチャは、ウェブページのさまざまな背景パターンとして、ウェブのいたるところで見つかります。それらはテクスチャに見えなかったり、カラフルだったり、あるいは非常に明るかったり非常に暗かったりすらするかもしれません。しかし調整後には、非常に興味深い効果が得られることに気づくでしょう。先ほどと同じように、適切なマスクを作ることで、画像のどの部分を実際にテクスチャ化するかを限定できます。たとえば、パゴダの写真でほぼ「白」の空だけのマスクを作りましょう。
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
さて、ドレスを着た女性の写真を想像してください。どんなパターンでも適切に陰影をつけ、それを元画像に重ねれば、ドレスをまったく違うデザインに置き換えられます。もちろん、最終結果に至る上記のバリエーションはたくさんあり、どの特定の手法を使うかはあなた次第ですが、基本的な考え方は同じです。画像をテクスチャ化し、マスクして結果を重ねるのです。余談ですが、オーバーレイ アルファ合成法も見ておくことをお勧めします。これは ハードライト 合成と同じですが、2 つの画像を入れ替えたものにすぎません。また、さまざまな方法で画像をテクスチャ化するのに使える、他にもたくさんの 陰影合成法 があります。
クロマキー・マスキング -- 特定色の領域単位での加工
左の写真は、ある利用者から IM フォーラムの議論 で提供されたものです。彼は、きれいな「ピンク」色だった女の子のシャツの色を変えたがっていました。問題は、その色が単に「ピンク」なのではなく、さまざまな色合いの「ピンク」の幅広い範囲だということです。上で見たように、画像を変更するための最初の段階は、典型的には関心のある領域の適切なマスクを生成することです。ここでは、特定色のマスクを生成するために クロマキー として知られる手法を使います。この手法は一般に、マスクとして使うために画像内の特定色を探します。これは、テレビや映画で広く使われている「ブルー」スクリーンや「グリーン」スクリーンの効果に使われる手法でもあります。
これは基本的に、チャンネル画像の分離 によって「色相(Hue)」を抽出してから、求める「色相の色合い」を探す、というものです。たとえば...
|
magick shirt.jpg -colorspace HSL -channel Hue -separate shirt_hue.jpg
しかし、この色相画像にはいくつか問題があります。
- まず、「ピンク」色は「赤」に非常に近く、それは色相が「巻き戻る」境目にあります。これが問題にならないように、私は モジュレート を使って、色相をその「不連続点」から遠ざけます。これは「グリーン」や「ブルー」スクリーンの「クロマキー」抽出では問題になりません。
- この「ピンク」色は、彩度の高い色でもなく、非常に低い彩度値を持っています。これは、その「色相」が本来あるべきほど強くないことを意味します。
- もう 1 つの問題はグレーの背景です!!!!! グレーは色相をほとんど持たないので、最終マスクから彩度のほとんどない、または全くない領域を取り除く必要があります。さもないと、背景のものを変えてしまいます。なお、変更を色相のシフトに限定するなら、技術的にはこれは必要ありません。色相のシフトは彩度のない色には影響しないからです。
要するに、入力画像は、肌(または髪)の色にもあまり似ていない、より明るく強い色だったほうがうまくいったでしょう。たとえば強いブルーやグリーンのシャツです。しかし、私は与えられたもので作業します。 ![[IM Output]](../static/img/photos/shirt_hue.jpg)
では、2 つのチャンネルマスクを抽出して組み合わせましょう。モジュールを使って画像の色相を「巻いた」後、色相 = Gray64 であり、グレー背景については 彩度(Saturated)= Black である点に注意してください。 |
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](https://imagemagick.org/command-line-options/#-mask)」を参照)として知られています。 ![[IM Output]](../static/img/photos/shirt_mask.png)
ここでは、先ほどのマスクの小さな欠陥を(任意で)きれいにし、それを反転して「書き込み保護」したい領域を定義します。それからこのマスクを設定し、色相をシフトして「ピンク」を「ライトブルー」色に変え、結果の画像を保存します。 |
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
そう、わずかに「ピンク」の縁が、特に袖の内側に残っています。また、彼女の腕の肌の小さな領域が、かなり濃いブルーになってしまいました。基本的にこれらはマスクの欠陥で、マスクをもう少し丁寧に仕上げれば、これらの問題は直せます。しかし悪くない結果です。より良いマスクを生成する 1 つの方法は、ずっと大きく高解像度の画像を使うことです。結果の画像を後でリサイズすれば、これらの小さな欠陥も(うまくいけば)取るに足らないものに減ります。 ![[IM Output]](../static/img/photos/shirt_blue.jpg)
この特定の例の本当の問題は、「キーとなる色」が通常の肌色に非常に近いことで、これでは本当に問題を招くだけです! だからこそ、この手法を使う人々は「グリーン」や「ブルー」のスクリーンを使うのです。それらの色は、スクリーンの前にいる人の「肌」の色とできるだけ異なるからです。なお、ソース画像や作業画像として JPEG を使わないほうがよいことに注意してください。本当のところ、JPEG は最終画像にのみ使うべきです! これが、そもそもこれほど多くの「マスクの欠陥」が生成された理由の一部です。
グリーンスクリーン
_今後の例。「グリーンスクリーン背景」のクロマキー・マスキングを使う。ウィキペディアの記事 クロマキー を発展させたもの。
「グリーンスクリーン」の扱いにおける本当の問題は「色かぶり(color spill)」で、細く明るい色の髪(ブロンド)や半透明の領域が、最悪の色かぶり効果を生み出す。
単純な色かぶり除去(色補正)_
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 ユーザーフォーラムでの 塗り絵ページの生成 に関する長い議論の中で、単純な写真を子供が塗れる何かに magick で変えるための、以下のクックブックのレシピが開発されました。以下は、ベルリンのホロコースト記念碑を私が撮った写真に適用した、これまでで最良の結果です。
magick holocaust_sm.jpg \
-edge 1 -negate -normalize \
-colorspace Gray -blur 0x.5 -contrast-stretch 0x50% \
color-in.gif
# 強く陰影のついた写真には...
# #-segment 1x1 +dither -colors 2 -edge 1 -negate -normalize \
上の試みにおける最後の方の操作は、線を滑らかにし、全体的な結果を改善しようとするものです。もちろん、上の手法は、良くくっきりとした色の変化があり、できれば私が上で使ったより高解像度の画像にのみ有用です。すでに黒い輪郭と明るい色の背景を持つ漫画画像については、上の方法に エッジ検出 を使うと、黒い輪郭の「二重化(twinning)」効果が直接生じます。この効果は、記念碑へと続く小道のタイルが、左下隅で二重化した線になっているのに見て取れます。これは エッジ検出 の仕組みによる成果物(アーティファクト)であり、IM 使用例のそのセクションでさらに多くの例を見られます。解決策は、色のついた領域を輪郭化するために「[-edge](https://imagemagick.org/command-line-options/#edge)」を使う前に、この種の画像を反転(negate)することです。
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
また私は、「[-edge](https://imagemagick.org/command-line-options/#edge)」が好んで生成するらしい個々の点を後で取り除けるよう、「[-threshold](https://imagemagick.org/command-line-options/#threshold)」もかけています。その後、画像内のエイリアスのかかった線を、再び滑らかにしようとします。上のものは、輪郭を見つけるために 合成のディバイド(Divide) 法を活用すべく、GIMP のフォトコピーフィルター に関する議論で追加されました。
magick taj_mahal_sm.png -colorspace gray \
\( +clone -blur 0x2 \) +swap -compose divide -composite \
-linear-stretch 5%x0% photocopy.png
上の「[-linear-stretch](https://imagemagick.org/command-line-options/#linear-stretch)」操作は、画像の暗い領域をどれくらい黒くするかを調整し、一方で「[-blur](https://imagemagick.org/command-line-options/#blur)」の 'sigma' は陰影の鮮明さを定義します。
鉛筆スケッチ
画像を 鉛筆スケッチ に変換する Photoshop(PSP)チュートリアル を使って、IM ユーザーフォーラム の dognose 氏は、同等の 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]](../static/img/photos/pencil_tile.gif)
あとは、この「鉛筆」の陰影画像を写真と重ねてブレンドするだけです。鉛筆画像は、処理する画像と同じサイズのキャンバスを作るためにタイル状に敷き詰められます。それから タイル化キャンバス で見られる手法を使って画像に適用されます。これは次に、元画像のグレースケールコピーへ混ぜ合わされます。
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
「[composite](basics.html#composite)」コマンドの「[-blend](https://imagemagick.org/command-line-options/#blend)」演算子は「magick」コマンドでは使えないので、自前(DIY)の「[-fx](https://imagemagick.org/command-line-options/#fx)」演算子を使って同等のことを行うことにしました。これを行うには、おそらくもっと良く、もっと速いが、もっと複雑な方法があります。(提案を歓迎します)これは最終版ではありません。この演算子は、画像内のより明るいが鮮明な色の変化の一部を輪郭化するのに必要な、いくつかのエッジ強調の側面を取りこぼしているからです。上のものを改善できますか? 上のアルゴリズムは、生成される「鉛筆タイル」のための「[-resize](https://imagemagick.org/command-line-options/#resize)」による平滑化なしですが、芸術的変換「[-sketch](https://imagemagick.org/command-line-options/#sketch)」として IM に組み込まれました...
magick pagoda_sm.jpg -colorspace gray -sketch 0x20+120 sketch_new.gif
周辺減光(ビネット)の除去 写真を撮るとき(デジタルでもそうでなくても)、カメラのレンズは一般に画像の縁と隅を暗くします。これは「ビネッティング(周辺減光)」と呼ばれます。実際、このレンズ効果は非常によくあるので、しばしば「[-vignette](https://imagemagick.org/command-line-options/#vignette)」演算子を使って意図的に偽装されます。ビネット変換 を参照してください。Martin Herrmann 氏 Martin-Herrmann@gmx.de は、写真からカメラのビネッティングを取り除きたいと考えました。基本的に彼は、フラッシュを使わずに明るい光の中で白い紙の写真を撮りました。それから彼は、これを実際の写真と組み合わせて、画像の縁と隅を適切に明るくしたいと考えました。基本的に私たちがやりたいのは、元の写真を、明るく照らされた白い紙の写真のグレースケール画像で割ることで、これにより「白い紙」の写真が暗くなった量だけ、画像の各部分を明るくします。これは基本的に、「ソース」画像を「背景」画像で割る、合成法の「ディバイド(Divide)」です。たとえば、
magick nikon18-70dx_18mm_f3.5.jpg vegas_orig.jpg \
-compose Divide -composite vegas_fixed.jpg
しかし、「白い紙」の写真はおそらく本当の白ではなく、この「オフホワイト」色で画像を明るくしたくはないでしょう。これを直すには、除数となる画像を、その中心ピクセルの色で掛ける必要があります。以下は 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]](../static/img/img_photos/vegas_fixed_fx.gif)
拡大した写真、特に左上と右上の「空」の隅を注意深く見ると、ビネッティング効果と、行われた補正が見て取れます。完璧な解決策ではなく、もう少し調整の余地があります。たとえば、スケーリング用のピクセルを使う代わりに、「白い紙」画像を前処理し、より良いビネット除去結果のために調整することもできるでしょう。なお、JPEG を使うことはいかなる種類の写真作業にも推奨されないことに注意してください。この形式は、結果にいくらかのアーティファクトや不整合をもたらすことがあるからです。この形式は、最終結果の保存と表示にのみ適しています。ビネッティングの補正についての大きな議論は、IM ユーザーフォーラムの議論 ピンホールカメラのためのアルゴリズムによるビネッティング補正? にあります。ビネッティングに影響しうるものには以下が含まれます...
- レンズからフィルムまでの距離。遠いほど光がより広がる。
- 光の角度による、絞りの「円」(レンズまたはピンホール)の面積。
- 絞り周りのカメラ素材の配置。たとえばレンズホルダーやピンホールの厚さ。
![[IM Text]](../static/img/photos/pagoda_sm_exif.txt.gif)
![[IM Text]](../static/img/photos/pagoda_sm_time.txt.gif)
![[IM Output]](../static/img/img_photos/night_club_tn.gif)
![[IM Output]](../static/img/photos/night_club_fixed.gif)
![[IM Output]](../static/img/img_photos/night_scape_tn.gif)
![[IM Output]](../static/img/photos/night_scape_fixed.gif)
![[IM Output]](../static/img/photos/beijing_model.jpg)
![[IM Output]](../static/img/img_photos/ny_family_tn.jpg)
![[IM Output]](../static/img/img_photos/ny_family_tn.png)
![[IM Output]](../static/img/photos/ny_family_merged_tn.jpg)
![[IM Output]](../static/img/img_photos/holocaust_tn.gif)
![[IM Output]](../static/img/img_photos/spiral_stairs_tn.gif)
![[IM Output]](../static/img/photos/overlap_photos.jpg)
![[IM Output]](../static/img/photos/overlap_series.jpg)
![[IM Output]](../static/img/img_photos/anthony_1.jpg)
![[IM Output]](../static/img/img_photos/anthony_2.jpg)
![[IM Output]](../static/img/img_photos/jacob_vs_jacob_md.jpg)
![[IM Output]](../static/img/img_photos/zelda_tn.gif)
![[IM Output]](../static/img/photos/zelda_face_mask.gif)
![[IM Output]](../static/img/photos/zelda_anonymity.png)
![[IM Output]](../static/img/images/tile_fabric.gif)
![[IM Output]](../static/img/photos/texture_fabric.gif)
![[IM Output]](../static/img/photos/photo_texture.jpg)
![[IM Output]](../static/img/photos/pagoda_mask.png)
![[IM Output]](../static/img/photos/photo_texture_masked.jpg)
![[IM Output]](../static/img/img_photos/holocaust_sm.jpg)
![[IM Output]](../static/img/photos/charcoal.gif)
![[IM Output]](../static/img/photos/color-in.gif)
![[IM Output]](../static/img/images/piglet.gif)
![[IM Output]](../static/img/photos/color-in_cartoon.gif)
![[IM Output]](../static/img/img_photos/taj_mahal_sm.png)
![[IM Output]](../static/img/photos/photocopy.png)
![[IM Output]](../static/img/img_photos/pagoda_sm.jpg)
![[IM Output]](../static/img/photos/sketch.gif)
![[IM Output]](../static/img/photos/sketch_new.gif)
![[photo]](../static/img/img_photos/vegas_tn.gif)
![[photo]](../static/img/img_photos/nikon18-70dx_18mm_f3.5.gif)
![[photo]](../static/img/photos/vegas_fixed.gif)