|
|
|||||||||||||||||||||||||||||
|
29_Video_Handling ビデオ処理 |
H.Kamifuji . |
|
ここでは、ImageMagick6.x.x Examples of ImageMagick Usage の Video Handling から ImageMagick7.x.x への移植について、掲載します。 Web で、日本語に翻訳した 29_Video_Handling.pdf です。 従来は、UNIX 系の sh や windows の .bat コマンド・プロンプトを、利用していました。PowerShell 奮闘記 を、掲載したこともあり、PowerShell を、利用してみます。 現在(2024/10/27)では、PowerShell 7.4.6 が最新のようです。見直しをはじめましたが、 何と、" > パイプ問題(?)"が 解 消 されています。 パイプ関連事項を見直します。 現在(2024/10/26)では、ImageMagick 7.1.1-39 が最新のようです。上位互換について確認します。 このページは、IM 7.1.0 から IM 7.1.1-39 で改善点もダウングレードもありません。 |
|
ImageMagick はデジタルビデオの取り扱いに特に適していません処理しますが、特に Linux では、この目的で一般的に使用されます環境。 ここでは、実際の取り扱いに固有のテクニックと例を探りますライフ(およびレイトレーシング)ビデオシーケンス。 |
|
IM を使用してムービーGIFを作成するソフトウェア開発者、"ブノワ・ルーロー"、ディスカッション中 私と一緒に、"飛行機の上空を飛んでいる AVI" ビデオをくれました。IM ビデオ変換技術を相互に探求するのに役立ちます。 ただし、AVI 自体は非常に小さいですが、非圧縮ビデオはサイズが巨大な 6201996 バイトであり、107 フレーム上の 32448 色が含まれます。 ただし、IM はこのビデオを GIF アニメーションに変換するのに問題はありません。ただし、サポートされていない「AVI チャンク」を取得する可能性があることに注意してください。エラーは、"-quiet" "コントロール設定" を使用して無視できます。 |
||
#!/usr/bin/bash convert -quiet -delay 1 plane.avi plane.gif |
![]() |
|
#!/usr/bin/bash magick convert -quiet -delay 1 plane.avi plane.gif |
![]() |
|
|
これは、ImageMagick のデフォルトの "カラー量子化" を使用しましたビデオの非常に合理的な変換を生成するためのディザリング方法。ビデオは非常に少ない色を使用するため、色の問題はほとんどありません。端を発する。特にGIFには 256i 色があるため、これが常に当てはまるとは限りませんフレーム制限ごと。 ただし、アニメーションファイルのサイズは 1076354 バイトですが、減色と GIFi のため、サイズはわずか 1/5 ですが、ピクセルデータ圧縮、それはまだかなり大きいです。 また、結果のアニメーションをさらに調べると、画像内のフレームのうち、フレームには独自の個別のローカルがあることがわかります。"カラーテーブル" が追加されました。つまり、GIF アニメーションのすべてのフレーム独自のカラーインデックステーブルが必要です。つまり、各フレームはそれが少ないですが 256 色(GIF形式の制限により)、アニメーション全体が色の合計。 残念ながら、GIF形式はカラーテーブルを圧縮しないため、それらすべて追加のカラーテーブルは、最大 256 色*色 あたり 3 バイト *106フレームまで使用できます。または 81,408 バイトのファイル領域。1G バイトではそれほど多くないビデオですが、特に*106フレームをさらに最適化すると、かなりの量のスペースがあります。 さらにビデオ。これに加えて、アニメーションは GIF フレームの最適化がうまく行われません。じゃない背景が動いているという理由だけで(カメラが上向きにパンするため)、しかし また、IM が "エラー訂正" を使用したため ディザ(ヒルベルト曲線ディザ)、これは擬似ランダムパターンを生成します。フレームごとに異なる色。後の例では、これを作成します「ディザノイズ」がはるかに目立ちます。 共通グローバルカラーテーブル(Common Global Color Table) ここではビデオのすべてのフレームに対して、"単一のグローバルカラーテーブル" を生成します。 |
||
#!/usr/bin/bash
convert -quiet -delay 1 plane.avi \
+remap plane_cgc.gif
|
![]() |
|
#!/usr/bin/bash
magick convert -quiet -delay 1 plane.avi `
+remap plane_cgc.gif
|
![]() |
|
|
これにより、当然、ローカルカラーテーブルとファイルサイズが 1076354 バイトになります。 ご覧のとおり、結果のアニメーションには追加のローカルカラーテーブルはありません。代わりに、IM は、アニメーション内のすべてのフレームに基づいて、「最適な」 256 色の単一のグローバル カラー テーブルを生成しました。 残念ながら、これによりピクセルデータが圧縮されず、より強いディザが必要だったので、以前はそうでした。結果はわずかに見栄えの悪いアニメーション、それは前のものとほぼ同じサイズです。 限られた色のこの特定のビデオのために、私は数を減らすことさえできますさらに使用される色は、あまり問題なく64色だけと言いますが、さらに小さいアニメーションファイルサイズを生成します。しかし、これは非 常に依存しています。使用されているビデオシーケンスでは、あまり見栄えが良くない場合があります。 自分の動画は、特に次の場合に、より良い結果またはより悪い結果をもたらす可能性があります。より多くの色とおそらく複数のシーンを使用するビデオを処理します。 ユニバーサルグローバルカラーテーブル(Universal Global Color Table) 「小さな」GIFアニメーションを生成するより良い方法は、一般的な「最高の」グローバルカラーテーブルを生成するのではなく、普遍的な色の範囲アニメーション。存在する色に関係なくうまく機能するはずのものを使用してください元のビデオで。 これを行うもう一つの理由は、あなたがなしであなたをより長くすることができるということです色の選択に深刻な悪影響を及ぼしたり、ローカルカラーを並べ替えたりします各フレームのテーブル。各フレームは同じカラーマップにディザリングされ、アニメーション内の他のフレームとは完全に無関係です。 ここでは、 "'332'カラーマップ" を使用します。通常、透明度がない場合に非常に優れた標準カラーマップと見なされますが必要です。私はこのカラーマップ(または 219i 色の "Webセーフ」カラーマップ" )がさまざまなものでよく使用されているのをよく見てきました。ビデオフォーマット。 |
||
#!/usr/bin/bash
convert -quiet -delay 1 plane.avi \
-remap colormap_332.png plane_ugc.gif
|
![]() |
|
#!/usr/bin/bash
magick convert -quiet -delay 1 plane.avi `
-remap colormap_332.png plane_ugc.gif
|
![]() |
|
|
このアニメーションには 0 ローカルカラーテーブルがあり、その結果、アニメーションのサイズが小さくなるか 703924 バイトになります。 ただし、問題は、明白で迷惑な「ノイズ」が頻繁に表示されることです。一定の色の領域で。このノイズは、以前のすべてにも存在していましたビデオアニメーション。より普遍的なものを使用しているため、今だけ見えています。したがって、カラーマッピングをより広く広げます。 ノイズは、実際には、次の場合に設定された縮小カラーのディザリングによって引き起こされます。イメージを再生成します。ただし、これにより、フレームごとに変化する色により、画像内のバックグラウンドノイズ。これが発生する理由の詳細については、"E-Dithers の問題" を参照してください。 カラーディザリングをオフにして、「ディザノイズ」を取り除くことができます... |
||
#!/usr/bin/bash
convert -quiet -delay 1 plane.avi \
+dither -remap colormap_332.png plane_ugc_nd.gif
|
![]() |
|
#!/usr/bin/bash
magick convert -quiet -delay 1 plane.avi `
+dither -remap colormap_332.png plane_ugc_nd.gif
|
![]() |
|
|
ローカルカラーテーブルがあり、サイズは 110866 バイトです。 結果として得られるアニメーションは、元の 1/60 のサイズが非常に小さいです。アニメーション、一般的に単色生成の広がりのため非常に優れたピクセル圧縮。しかし、それはディザノイズを修正しながら、そして非常に小さなファイルサイズにすると、代わりにカラーバンディングが得られます。一般的に非常に悪いトレードオフと見なされています。 注文されたディザリングビデオ(Ordered Dithered Video) 本当の解決策は、別のカラーディザリング技術を使用することです。あるフレームから次のフレームに異なるパターンを生成しません。 たとえば、ここでは "順序付きディザ" を使用しました。ポスタリゼーションされたカラーレベルを使用して、同じユニバーサル "332 カラーマップ" をディザリングします。 |
||
#!/usr/bin/bash
convert -quiet -delay 1 plane.avi \
-ordered-dither o8x8,8,8,4 +remap plane_od.gif
|
![]() |
|
#!/usr/bin/bash
magick convert -quiet -delay 1 plane.avi `
-ordered-dither o8x8,8,8,4 +remap plane_od.gif
|
![]() |
|
|
1 個のローカルカラーテーブルがあり、サイズは 311691 バイトです。 上記では "+remap" も使用しました。演算子を使用して、すべての画像がまったく同じグローバルカラーマップを使用するようにします(注文されたディザはすでに最大256色に減少しています)。として色数はすでに最適であり、"+remap" 演算子はディザリングや減色 を行いません。 結果のディザパターンはランダムではなく、あるフレームから次のフレームへ。したがって、「ディザノイズ」はアニメーションにより、from からフレームへの固定カラーパターンが得られます。 パターンも非常に反復的であり、はるかに優れた圧縮を可能にします。 そして最後に、カラーマップが修正されているので、それはかなりうまくいくはずです使用されているビデオに関係なく。 高品質の注文ディザリングビデオ(Higher Quality Ordered Dithered Video) ただし、この特定のビデオでは、ほとんどがさまざまな色の範囲しか使用していません。青の色合いなので、実際にはによって提供される色をあまり使用しません。一般的なユニフォームカラーマップ。 実際、最後のビデオアニメーションでは 32 色だけが使用されていました! これは非常に低く、それ自体もかなり目立ちます。しかし、それはまた、この特定のアニメーションは、多数の「色」を使用することで恩恵を受けることができます。順序付けられたディザ操作のレベルは、全体的な品質を向上させます。 ただし、最初に、アニメーションがいくつのカラーレベルを取得できるかを決定する必要があります。両方の GIF ファイルによって課せられた 256i 色の制限に達する前に処理します。フォーマットとグローバルカラーマップの再マッピング。 ただし、トリッキーな部分は、保存する前にこれらを決定する必要があることです。限られたGIF形式へのアニメーション。そして、ここに私が使用 するコマンドがあります... #!/usr/bin/bash convert -quiet plane.avi -ordered-dither o8x8,23 -append -format %k info: 235 #!/usr/bin/bash magick convert -quiet plane.avi -ordered-dither o8x8,23 -append -format %k info: 235基本的に、使用するカラーレベルの数を増減しました。必要な256色の制限内にちょうど収まった数字を持っていました。 次に、検出された「カラーレベル」の選択を平面アニメーションに適用できます。 |
||
#!/usr/bin/bash
convert -quiet -delay 1 plane.avi \
-ordered-dither o8x8,23 +remap plane_od2.gif
|
![]() |
|
#!/usr/bin/bash
magick convert -quiet -delay 1 plane.avi `
-ordered-dither o8x8,23 +remap plane_od2.gif
|
![]() |
|
|
0 個のローカルカラーテーブルがあり、サイズは 686704 バイト数と 235 色です。 ご覧のとおり、非常に高品質の注文ディザビデオが生成され、これは、「最高のカラーマップ」グローバルカラーマップバージョンと同等です。以前に生成されましたが、サイズは1/3小さく、「ディザノイズ」は今でははるかに見づらいです。 もちろん、品質がはるかに高いため、より大きなファイルが必要です。低品質バージョンほど圧縮されないため、サイズ。一方、あなたは実際に品質をうまく制御できるようになりました。使用される「カラーレベル」の数の形でのファイルサイズのトレードオフ。 このテクニックは、アニメーションにとって "特別なケース" であることを覚えておいてください。あまり多くの色を使用しません。そして、さらに追加してビデオを長くするフレームはまた、より多くの色を追加するため、色を減らす必要があります。レベルの品質管理。 これは私がまだ見たことのない色最適化の最良の方法についてです。一般的な GIFi アニメーション。「ディザノイズ」を除去し、ある程度の品質を提供します。コントロール、および他のGIFアニメーション最適化を使用する機能を保持します。フレーム最適化などのメソッド。 圧縮(透明度)の最適化(Compression (Transparency) Optimization) この動画はパンニングカメラを使用しているため、動画の背景はフレームごとに変化します。これは、GIF アニメーションが "フレーム最適化" をうまく行わないことを意味します。 ただし、単純な "透明度の最適化" を使用して、GIF の最終サイズをさらに縮小することはできます。アニメーション。 |
||
#!/usr/bin/bash
convert plane_od2.gif \
-layers OptimizeTransparency +remap plane_opt.gif
|
![]() |
|
#!/usr/bin/bash
magick convert plane_od2.gif `
-layers OptimizeTransparency +remap plane_opt.gif
|
![]() |
|
|
結果は、 559726 バイトのサイズと 236 色です。 すなわち、1つの余分な色、透明なカラーインデックスを画像に追加し、現在表示されている色を変更しないピクセルが作成されました透明。これにより、透明な領域の大きなセグメントが生成されます。元のアニメーション、および同様のピクセルシーケンスの繰り返し。は、最終的な GIF 画像で改善された LZW 圧縮を生成します。 悪くない、アニメーションはGIFへの直接変換の半分になりました、それでも適度に高品質です。 上記に追加したい場合は、さらに改善するためのテクニックについて話し合ってください。それら、私、またはIMフォーラムに連絡してください。私は聞いてとてもうれしいです。あなたの見解、テクニック、ディスカッション、または特定のビデオ/アニメーションを見るあなたが持っているかもしれない問題。 そのような議論の 1 つは、"アニメーションGIFで量子化するための「適切なレベル」" を見つけることです。 ギフロッシー圧縮 LZW 最適化(Giflossy Compression LZW Optimization) 新しいツール、"GifLossy" これは元の "Gifsicle" プログラムのフォークは、LZW が圧縮できるように各フレームの色を変更しますはるかに多くの画像。 たとえば、ここでは元のGIFアニメーションに適用し、次のように依頼しました。色を 1 つの 256 色 のテーブルに減らします。 |
||
#!/usr/bin/bash
gifsicle -O3 --lossy=80 --colors 256 plane.gif \
-o plane_giflossy.gif
|
![]() |
|
#!/usr/bin/bash
gifsicle -O3 --lossy=80 --colors 256 plane.gif `
-o plane_giflossy.gif
|
![]() |
|
|
これは絶対に驚くべき 214641 バイトサイズを持っています。注文を使用して達成したものほど高品質ではありませんディザリングしますが、サイズは 1/2 未満です。 上記の結果に勇気づけられて、私は "GifLossy" を最良の順序のディザで使用することにしましたそれがそれをさらに小さくすることができるかどうかを確認するために、私たちが得た結果。 |
||
#!/usr/bin/bash
gifsicle -O3 --lossy=80 plane_od2.gif \
-o plane_od2_giflossy.gif
|
![]() |
|
#!/usr/bin/bash
gifsicle -O3 --lossy=80 plane_od2.gif `
-o plane_od2_giflossy.gif
|
![]() |
|
|
そして、 202881 バイトのサイズはさらに小さくなりました。残念ながら、基本的に高品質の注文ディザを失いました私たちが以前に達成するために一生懸命働いている結果。これは残念です。 |
||
|
すべての画像がデジタルカメラからのものであるとは限りません。画像を抽出することは非常に一般的です。非 CCD ビデオカメラからのデジタルビデオフィードから。これらの画像はテレビに直接表示するためにインターレースされ、2 行ごとに画像の異なるフレーム(インターレース)。 物事が動いていない2つのフレームの場合、インターレースは通常あまりありません顕著。おそらく、画像のわずかなエッジのぼやけを生成します。しかし、いつ動きの速いオブジェクトが関与している場合、結果として得られるインターレース画像は非常に 2 つのフレームがマージされているため、当惑します。 Wolfgang Hugemann<Auto@Hugemann.de>(ドイツ)は、この問題を抱えていて、"クラッシュテスト" のスナップショットを送ってくれました。Wolfgang は自分を連れて行った。しかし、デモンストレーションのために私はより小さな画像を使用します。これからトリミングされました。ただし、テクニックはフルサイズで機能します画像。 |
||
#!/usr/bin/bash
convert video_frame.png -crop 100x100+200+470 \
+repage interlaced.png
|
![]() |
|
#!/usr/bin/bash
magick convert video_frame.png -crop 100x100+200+470 `
+repage interlaced.png
|
![]() |
|
![]() |
Wolfgang Hugemann は、元のビデオフレームにTIFF形式を使用しました。IM の例で使用するためにこれを PNG に変換しました。使用しないでください。これらの画像の JPEG は、処理が完了するまでこのプロセスに必要な低レベルの品質を破壊します。 |
|
ご覧のとおり、インターレースは2つの別々のフレームを示しています。インターレースPALデジタルビデオシーケンス(約50ハーフフレーム/秒)。はい、車は非常に速く動いていて、カメラは高速シャッターを使用しています、非常に高品質のビデオ画像を生成します。結果の画像は 2 つです車のサイドミラーがかなりの距離を移動する織り交ぜられたハーフフレームハーフフレーム間の間の 1/50 秒の期間中。 ここでは、インターレースされたハーフフレームの1つ(2行ごと)を置き換えます。白と。これは、「BoB」として知られる標準的なインターレース解除方法です。フィルター。これは、IMの例のためにヴォルフガングによって寄稿されました。 |
||
#!/usr/bin/bash
convert interlaced.png \
-fx "floor(j/2)==j/2 ? u : 1" deinterlace_1.png
|
![]() |
|
#!/usr/bin/bash
magick convert interlaced.png `
-fx "floor(j/2)==j/2 ? u : 1" deinterlace_1.png
|
![]() |
|
|
"FX 演算子" が遅いので、代替とは、「縞模様の画像」を作成することです。そのような画像を生成することができます特別な "pattern:Horizontal2" 組み込みイメージから。
その画像は、 'Screen' 合成方法を使用してオーバーレイして、元の画像とオーバーレイできます。白い線を使用するか、'Multiply' を使用するか、黒い線をオーバーレイします。例えば。。。 |
||
#!/usr/bin/bash
convert -size 100x100 pattern:Horizontal2 interlaced.png \
-compose Multiply -composite deinterlace_2.png
|
![]() |
|
#!/usr/bin/bash
magick convert -size 100x100 pattern:Horizontal2 interlaced.png `
-compose Multiply -composite deinterlace_2.png
|
![]() |
|
|
パターンの否定を使用して、インターレースの残りの半分を選択できます画像。または、 'Multiply' を 'Screen' に変更した場合背景が白のフレームを抽出できます。 別の方法として、不足しているフレームラインを埋めようとしました前の行を複製します。 |
||
#!/usr/bin/bash
convert interlaced.png -fx "u.p{i,j-j%2}" deinterlace_3.png
|
![]() |
|
#!/usr/bin/bash
magick convert interlaced.png -fx "u.p{i,j-j%2}" deinterlace_3.png
|
![]() |
|
|
また、ピクセレーション テクニックを使用して画像を縮小および拡大し、2 行ごとに 2 倍にすることもできます。 |
||
#!/usr/bin/bash
convert interlaced.png -sample 100%x50% \
-sample 100%x200% deinterlace_4.png
|
![]() |
|
#!/usr/bin/bash
magick convert interlaced.png -sample 100%x50% `
-sample 100%x200% deinterlace_4.png
|
![]() |
|
|
そして、わずかなバリエーションで、両側の線を組み合わせてサイズ変更拡張の一環として、ハーフフレーム画像を垂直方向に滑らかにします。 |
||
#!/usr/bin/bash
convert interlaced.png -sample 100%x50% \
-resize 100%x200% deinterlace_5.png
|
![]() |
|
#!/usr/bin/bash
magick convert interlaced.png -sample 100%x50% `
-resize 100%x200% deinterlace_5.png
|
![]() |
|
|
その結果、インターレースの1つのフレームが特にうまく抽出されます。 ビデオ画像から残りのハーフフレームを抽出する場合は、"sampling:offset" (IM v6.8.4-7 以降) 調整できます。 |
||
#!/usr/bin/bash convert interlaced.png -define sample:offset=75 \ -sample 100%x50% -resize 100%x200% deinterlace_6.png |
![]() |
|
#!/usr/bin/bash magick convert interlaced.png -define sample:offset=75 ` -sample 100%x50% -resize 100%x200% deinterlace_6.png |
![]() |
|
|
このバージョンの IM より前は、画像を 1 ピクセルずつ "-roll" する必要があります。同じ結果を達成します。 |
||
|