ホームページ >ウェブフロントエンド >jsチュートリアル >Javascript画像処理—平滑化処理の実装原理_JavaScriptスキル
はしがき
前回の記事では、画像の仮想エッジについて説明しました。この記事では、スムージング (つまり、ぼかし) 処理から始めます。
基本原則
ここでは、OpenCV 2.4 C のスムージング処理と OpenCV 2.4 C のエッジ勾配計算の関連コンテンツへの直接参照を示します。
スムージングはぼかしとも呼ばれ、シンプルで頻繁に使用される画像処理方法です。
平滑化にはフィルタ
が必要です。 最も一般的に使用されるフィルターは線形フィルターです。 フィルター、線形フィルター プロセスの出力ピクセル値 (例: ) は、入力ピクセル値 (例: ) の加重平均です。
はカーネル
と呼ばれ、単なる重み付け係数です。
これには「畳み込み」と呼ばれる演算が含まれますが、畳み込みとは何ですか?
コンボリューションは、各画像ブロックと特定の演算子 (カーネル) の間で実行される演算です。
核? !
nbsp;カーネルは固定サイズの数値配列です。配列にはアンカー ポイント
があり、通常は配列の中心に位置します。
しかし、これはどのように機能するのでしょうか?
画像の特定の位置のコンボリューション値を取得したい場合は、次の方法で計算できます:
カーネルのアンカー ポイントをピクセルのその特定の位置に配置し、同時にカーネル内の他の値がピクセルの近傍の各ピクセルと一致するように、カーネル内の各値を乗算します。対応するピクセル値を加算し、結果をアンカー ポイントに対応するピクセルに配置します。画像内のすべてのピクセルに対して上記のプロセスを繰り返します。
上記の処理を式で表すと次のようになります。
画像の端の畳み込みはどうでしょうか?
畳み込みを計算する前に、ソース イメージの境界をコピーして仮想ピクセルを作成し、エッジに畳み込みを計算するのに十分なピクセルがあるようにする必要があります。前回の記事で仮想エッジ機能が必要になったのはこのためです。
平均平滑化
平均平滑化は実際には、カーネル要素がすべて 1 であり、それをカーネルのサイズで割る畳み込み演算です。数式は次のとおりです。
平均平滑化関数ブラーを実装しましょう:
ガウス平滑化
最も便利なフィルター (最速ではありませんが)。 ガウス フィルター処理は、入力配列の各ピクセルをガウス カーネル
で畳み込み、その畳み込みの合計を出力ピクセル値として扱います。
一次元ガウス関数を参照すると、中央が大きく両側が小さい関数であることがわかります。
つまり、ガウスフィルターの重み付け数値は中央が大きく、その周囲が小さくなります。
2 次元ガウス関数は次のとおりです:
は平均 (ピーク値に対応する位置)、 は標準偏差 (変数) を表します と変数 それぞれに平均値があり、それぞれに標準偏差があります)。
ここでは OpenCV の実装を参照していますが、まだ分離フィルターが使用されていないため、最適化の余地があるはずです。
まず、ガウス フィルターの 1 次元配列を返す getGaussianKernel を作成します。
中值平滑
中間値フィルタは、画像の各画素を、
の中間値 に置き換えます。 は、ぼかし領域の循環を使用して、コア内のすべての値を取得するだけで、並べ替え機能によって中間の値を取得し、その後、その値で置き換えられます。
复制代