Opencvベースのエッジ保存フィルタリングアルゴリズム

エッジ保持フィルタリングアルゴリズム

ガウスバイラテラルフィルター

ガウスフィルタリングでは、画像空間の位置がウェイトに与える影響を考慮し、中心点に近いほどウェイトが大きくなります。ただし、ガウスフィルター処理では、画像のピクセル分布が画像のたたみ込みの出力に与える影響は考慮されません。ガウスのバイラテラルフィルタリングはこの点を十分に考慮し、ピクセル値の空間分布の大きな違いを保持するため、画像のエッジ情報を完全に保持できます。
画像の特定の領域にあるピクセルの分布には特定のルールがあります。エッジ情報を保持するには、類似したピクセル値を持つピクセルのみが計算に参加し、差が大きいものはコンボリューション計算に参加しないでください。いわゆるバイラテラルフィルタリングとは、空間位置とピクセル値の分布の両方が同時に考慮されることを意味します。

ここに画像の説明を挿入

opencv API:

void bilateralFilter( InputArray src, 
					  OutputArray dst, 
					  int d,
					  double sigmaColor, double sigmaSpace,
					  int borderType = BORDER_DEFAULT );

InputArray src:Matタイプの入力画像。画像は、8ビットまたは浮動小数点のシングルチャネルまたは3チャネルの画像でなければなりません。
。OutputArray dst:元の画像と同じサイズとタイプの出力画像。
。int d:フィルター処理における各ピクセル近傍の直径範囲を示します。この値が正でない場合、関数は5番目のパラメーターsigmaSpaceから値を計算します。通常は0です。
。double sigmaColor:カラースペースフィルターのシグマ値。このパラメーターの値が大きいほど、ピクセルの近傍の色がより広く混合​​され、より大きな半等しい色の領域が生成されます。できるだけ大きく取ってください。
。double sigmaSpace:座標空間でのフィルターのシグマ値。値が大きい場合、類似した色を持つ遠方のピクセルが互いに影響し合うため、広い領域の十分に類似した色で同じ色を取得できます。d> 0の場合、dは近傍サイズとsigmaSpaceの顔の特徴を指定します。それ以外の場合、dはsigmaSpaceに比例します。できるだけ小さくするようにしてください。
。int borderType = BORDER_DEFAULT:画像の外側のピクセルの特定の境界線モードを推測するために使用され、デフォルト値はBORDER_DEFAULTです。

	Mat image = imread("E:\\picture\\dot.png");
	imshow("原始图", image);

	Mat dstimg;
	bilateralFilter(image, dstimg, 0, 100, 10);
	imshow("bilateral", dstimg);

	imwrite("E:\\picture\\dotout.png", dstimg);
	waitKey(0);

ここに画像の説明を挿入

平均シフト平均シフトフィルター

平均シフト平均シフトフィルタリングは一種の画像エッジ保存フィルタリングアルゴリズムであり、分水界セグメンテーションの前に画像のノイズを除去するためによく使用されます。同時に、ターゲット追跡、画像比較、ビデオ分析などの画像処理タスクにも適用されるため、平均シフトフィルターは非常に広く使用されているフィルターアルゴリズムです。

平均シフトフィルターアルゴリズムは、ピクセル値の空間範囲分布を完全に考慮します。分布を満たすピクセルのみが計算に参加します。ピクセル平均(RGB 3値)と空間位置(ピクセル座標X、Y)が計算され、新しい平均位置はウィンドウの中心位置として使用され、ピクセル値の特定の空間分布に基づいて平均と平均位置を計算し続けるため、中心位置は位置が変化しなくなるまで(dx = dy = 0dx = dy = 0)常にシフトされますが、実際のピクセル分布は一般に、これは特に理想的ではないため、マイグレーション停止条件(マイグレーションの数など)は人為的に設定され、最終的なRGB平均値を中央のピクセルに割り当てることもできます。

場合によっては、平均シフトフィルターはガウスバイラテラルフィルターよりも効果的です。

opencv API:

void pyrMeanShiftFiltering( InputArray src, OutputArray dst,
                            double sp, double sr,
                            int maxLevel = 1,
							TermCriteria termcrit
							=TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS,5,1) );

InputArray src:Matタイプの入力画像。画像は、8ビットまたは浮動小数点のシングルチャネルまたは3チャネルの画像でなければなりません。
。OutputArray dst:元の画像と同じサイズとタイプの出力画像。
。sp:ウィンドウサイズ。
。sr:色空間の半径。
TermCriteria:移行の停止条件を指定します。デフォルトの移行は5回で、2つの連続するdx + dy dx + dyは1以下です。

	Mat image = imread("E:\\picture\\dot.png");
	imshow("原始图", image);

	//Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
	Mat dstimg;
	pyrMeanShiftFiltering(image, dstimg, 15, 50, 1);
	imshow("bilateral", dstimg);

	imwrite("E:\\picture\\dotout.png", dstimg);
	waitKey(0);

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_36587495/article/details/108555063