イメージピラミッド、ガウスピラミッド、ラプラシアンピラミッドとは何ですか? ラプラシアン ピラミッドとガウス ピラミッドを使用して元の画像を再構成するための Python-OpenCV コードが添付されています。

画像ピラミッドは、画像の多重解像度表現のための効果的かつシンプルな構造です。
画像ピラミッドは、ピラミッド状に配置された、段階的に解像度が低くなる一連の画像です。画像ピラミッドの底部は処理される画像の高解像度表現であり、上部は低解像度表現です。

画像ピラミッドは何をするのでしょうか?
画像ピラミッドは、画像のスケーリング、画像再構成、画像融合、および画像強調技術で一般的に使用されます。
画像融合技術における画像ピラミッドの応用例を次に示します。現在、多重解像度タワー画像融合アルゴリズムがより一般的に使用されている画像融合方法です。このタイプのアルゴリズムでは、元の画像がレイヤーごとにフィルタリングおよび縮小されて、塔のような構造が形成されます。タワーの各層では、融合アルゴリズムを使用してこの層のデータを融合し、アルゴリズムによって処理されたタワー構造を取得します。次に、処理されたタワー構造を再構築して合成画像を取得します。
さらに、画像ピラミッドは元の画像をさまざまな空間周波数帯域に分解できるため、さまざまな演算子を使用して、さまざまな分解層のさまざまな周波数帯域の特徴と詳細について、よりターゲットを絞ったアルゴリズムの最適化を実現できます。

ガウス ピラミッドとラプラシアン ピラミッドは、最も一般的な画像ピラミッドの ​​2 つです。

ここではガウスピラミッドとラプラスピラミッドについて詳しく紹介します。

ガウス ピラミッド ガウス
ピラミッドとは、ガウスぼかしフィルタリングとダウンサンプリングを通じて画像のサイズを継続的に縮小することにより、ピラミッド内に複数の解像度を含む画像のグループを指します。ガウス ピラミッドの形式は次の図に示すとおりです。
ここに画像の説明を挿入します
通常の状況では、ガウス ピラミッドの最下層は元の画像であり、上層の各層はガウスぼかしフィルター + ダウンサンプリングを通じて画像のサイズを縮小します。
通常、画像の縦と横は元の半分に縮小されますが、そのたびに縦と横が元の半分に縮小されるため、画像は非常に急速に縮小します。一般的なガウスピラミッドは3~6です。

関数 pyrDown() は OpenCV で提供されており、画像のガウス ピラミッドの前の層を生成するために使用されます。
関数 pyrDown() のプロトタイプは次のとおりです。

void cv::pyrDown(InputArray src,
                 OutputArray dst,
                 const Size & dstsize = Size(),
                 int borderType = BORDER_DEFAULT )

関数 pyrDown() のパラメータの意味は次のとおりです。
src — 入力画像
dst — 出力画像。その幅と高さはおよそ src の 1/2 で、正確なサイズは 3 番目のパラメータ dstsize によって決まります。
dstsize —ターゲット イメージのサイズ。デフォルト値は Size((src.cols+1)/2, (src.rows+1)/2) です。独自に指定する場合は、次の条件を満たす必要があります。
ここに画像の説明を挿入します
bordertype - ガウス フィルタリングを実行する場合のボーダー拡張フラグ。境界拡張の詳細については、次のブログ投稿を参照してください。
https://www.hhai.cc/thread-178-1-1.html
関数 pyrDown() を使用してガウス ピラミッドの前の層を生成するには、次の手順が必要です。 2 つのプロセス、つまりガウス カーネル コンボリューション (ガウス ブラー フィルタリングの実装に使用) とダウンサンプリングの 2 つのプロセスがあります。G n G_{n}
にしてみましょうGガウス ピラミッドの ​​n 番目の層の画像を表し、G 0 G_{0}G0ガウス ピラミッドの最下層を表します。これは実際には元のイメージです。G n + 1 G_{n+1}を取得するにはGn + 1、最初にG n G_{n}を計算する必要があります。Gガウス カーネル畳み込み、つまりガウス ローパス フィルタリングを実行し、すべての偶数行と偶数列を削除します (これはダウンサンプリング操作です)。これによりG n + 1 G_{n+1}が得られます。Gn + 1
関数 pyrDown() で使用されるガウス カーネルは次のとおりです。
ここに画像の説明を挿入します
質問: ガウス ピラミッドでは、ダウンサンプリング操作の前にガウス ローパス フィルタリングが必要なのはなぜですか。
回答: これにより、ガウス ピラミッドのローパス処理の特性が保証されるだけでなく、ダウンサンプリングされた画像に境界ギャップが生じないように画像を平滑化することもできます。
要約すると、画像のガウス ピラミッドの上部レイヤーは、次のレイヤーをローパス フィルター処理し、それを交互の行と列でサンプリングすることによって取得されます。上層画像のサイズは、次層画像の約 1/4 です。

ラプラシアン ピラミッド
ラプラシアン ピラミッドは、ガウス ピラミッドの画像再構成を実現するために実際に存在します。ガウスピラミッドに基づいて生成されます。ラプラシアンピラミッドは、ガウスピラミッドとその上層との差分画像をアップサンプリングにより拡大したものであり、ここでのアップサンプリングは通常補間により行われる。

Hao Honjun は、ラプラスのピラミッドが何であるかを鮮明かつ具体的に説明する模式図をインターネット上で見つけました。
この模式図を表示するには、このブログ投稿の原文にアクセスしてください。
このブログ投稿の原文リンク:

https://www 。 hhai.cc/thread-198-1-1.html

上記の Hao Honjun が見つけた概略図から、n 番目の層のラプラシアン イメージは、実際には、n 番目の層のガウス イメージと n+1 番目の層のガウス イメージ間のアップサンプリングされた差分であることがはっきりとわかります。はローパス フィルターであるため、特定のレベルのラプラシアン ピラミッドは、同じレベルのガウス ピラミッドの高周波成分を反映できると言えます。一部の文献では、ラプラシアン ピラミッドが兄弟のガウス ピラミッドの高周波成分を反映するという特性が、ラプラシアン ピラミッドの予測残差効果として言及されています。

上記のラプラシアン画像の生成プロセスから、ガウス ピラミッドを使用してラプラシアン ピラミッドを生成するプロセスでは、ガウス ピラミッドに N 層があると仮定して、ラプラシアン ピラミッドの ​​N 番目の層を計算するときに、 N層目のラプラシアンピラミッドを計算するには、N+1層目のガウスピラミッドを計算する必要があります。

OpenCV は、ラプラシアン ピラミッドの計算に役立つ関数 pyrUp() を提供します。これにより、n 番目の層のガウス ピラミッド画像をアップサンプリングし、ガウス畳み込みブラー フィルタリング操作を実行できます。
OpenCV の公式ドキュメントでは、その機能について次のように説明されています。
この関数は、ガウス ピラミッド構築のアップサンプリング ステップを実行しますが、実際にはラプラシアン ピラミッドの構築にも使用できます。まず、行と列がゼロでも注入することでソース イメージをアップサンプリングし、次に、pyrDown に4を乗算したものと同じカーネルを使用して結果を畳み込みます
。上記の説明から、関数 pyrUp() のアップサンプリング操作は、行と列を交互に均等に 0 値を追加することであることがわかります。アップサンプリングが完了した後、次の畳み込みカーネルを使用してガウス畳み込みブラー フィルタリング操作が実行されます。
ここに画像の説明を挿入します
注: 上記のコンボリューション カーネルは、関数 pyrDown() のコンボリューション カーネルとは異なります。具体的には、関数 pyrDown() のガウス コンボリューション カーネルを 4 倍して、関数 pyrUp() のコンボリューション カーネルを取得する必要があります。そうです、ブロガーのハオ・ホンジュンさんはまだそれを理解していませんが、アップサンプリング中に行と列ごとに 0 の値が補間されることに関連していると推測されています。理由を知っている友人はハオ・ホンジュンに知らせます。よろしくお願いします。

関数 pyrDown() のプロトタイプは次のとおりです。

void cv::pyrUp(InputArray src,
               OutputArray dst,
               const Size & dstsize = Size(),
               int borderType = BORDER_DEFAULT )

各パラメータの意味は関数 pyrDown() の意味と同じなので、ここでは詳しく説明しません。

ここで特別な注意を払う必要があります。関数 pyrDown() の dst パラメータで取得されるものは、ラプラシアン ピラミッド イメージではありません。
ラプラシアンピラミッド画像を取得したい場合は、次の式に従って計算を行う必要があります。L n L_{n}
にしましょうLラプラシアン ピラミッドの ​​n 番目の層を表します、G n G_{n}Gガウス ピラミッドの ​​n 番目の層を表すと、次のようになります。

L n = G n − Pyrup ( G n + 1 ) L_{n}=G_{n}-Pyrup(G_{n+1})L=Gピルアップ( G _ _ _n + 1)

明らかに、次の式を使用して n 層目のガウス ピラミッド イメージを再構成できます。
G n ' = L n + P yrup ( G n + 1 ) G_{n}^{'} =L_{n}+Pyrup(G_{n +1})Gn=L+ピルアップ( G _ _ _n + 1)

次に、Python-OpenCV に基づくサンプルコードは、
関数 pyrDown() と pyrUp() を包括的に使用するものであり、
サンプル コードは、最初に画像に対してガウス ピラミッドのダウンサンプリングを実行し、
その後、特定の層のラプランを使用します。ピラミッドは前のレイヤーイメージを復元します。
コードには詳細なコメントが付いているので、誰でも簡単に理解できるはずです。

特定のコードについては、このブログ投稿の原文を参照してください。
このブログ投稿の原文リンク:

https://www.hhai.cc/thread-198-1-1.html

コードを実行した結果は次の図に示されています: 上記の
ここに画像の説明を挿入します
ここに画像の説明を挿入します
結果から、ガウス ピラミッドとラプラシアン ピラミッドの特定の層を使用して再構成された画像は、元の画像よりも優れた詳細 (高周波成分) を持っていることがわかります。多くが欠けています。

おすすめ

転載: blog.csdn.net/wenhao_ir/article/details/124386034