転送:&OpenCVのメジアンフィルタ平均値フィルタ(とコードの実装)の中で:https://blog.csdn.net/weixin_37720172/article/details/72627543
我々は今日のブログを始める前に、私たちは、フィルタリングされたかを理解する必要があります。
OpenCVのメディアンフィルタ&平均値フィルタ(およびコード実装)最初の中で、我々は画像フィルタリングの概念を見てください。画像フィルタリング、画像のディテールの特徴を維持する条件下で、すなわち、雑音抑圧対象画像が、必須画像前処理操作であり、治療効果が良いか悪いかは、直接後続の画像処理及び分析の有効性に影響を与える、と信頼性。
左の図は、右の画像は、雑音指数です。
画像フィルタリング操作のノイズ成分を除去する平滑化または画像と呼ばれます。エネルギーの大部分は、画像信号または振幅スペクトル及び低周波数帯に共通している濃縮され、そしてより高い周波数帯域で、関心のある情報は、多くの場合、ノイズによって圧倒されています。したがって、高周波成分はノイズの影響を弱めることができ、フィルタの振幅を小さくすることができます。
画像フィルタの二つの目的がある:一つの画像認識特性パターンとして物体の特徴を抽出するが、他の画像処理の要件を満たすためにあるデジタル化に、画像は、ノイズ混入排除します。
フィルタリングプロセスの要件は、2つ有している:一つは、重要な情報とエッジ画像の輪郭などを損傷しないことができ、第二の画像の鮮明さが良好な視覚効果を。
フィルタを平滑化技術をフィルタリングし、低周波向上空間領域です。その目的は、2つのタイプがあります一つは不鮮明であり、他は、ノイズ除去することです。
単純平均法を使用して、一般的に空間領域を平滑化する、それがポイントに隣接する画素の平均輝度値を計算することです。直接近傍の大きさと平滑化の効果に関連して、より良い、より大きな近傍を平滑化の効果は、近隣が大きすぎると、平滑化出力画像が不鮮明になるように、エッジ情報の大きな損失を引き起こし、したがって、合理的な選択を必要としますフィールドのOサイズ。
鮮やかなメタファーの方法でフィルタである:ウィンドウ内に画像PUTに、平滑化フィルタのイメージを使用する場合、我々は窓を通って、窓含むの係数を重み付けフィルタを想像することができます我々が得る画像を見てください。
機能のマイクロダーマブレーションの美しさ:私たちの生活の中でフィルタリングアプリケーションのため。我々は、ノイズに例えでこぼこ直面した場合、アルゴリズムは、我々は、皮膚のルックスは非常に滑らか自分撮りして、ノイズを除去することです。
このブログは、メディアンフィルタと平均値フィルタの2つのアルゴリズムを紹介します
A.平均フィルタ
正方形の画像領域(典型的には3×3)の画素点の全ての画素値の平均値の中心内。平均フィルタリング操作は、全体の画像よりも多くのために行われます。
私たちは理解されるであろうマトリックスを見ることができます
欠陥:平均フィルタ自体、また、画像の細部をノイズ除去画像を破壊しながら、十分に画像のディテールを保護することができない固有の欠点があるので、画像が不鮮明になることを、適切にノイズの点を削除することはできません。具体的には、塩、コショウノイズ
実装コード:
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include<ctime>
using namespace cv;
using namespace std;
//均值滤波
void AverFiltering(const Mat &src,Mat &dst) {
if (!src.data) return;
//at访问像素点
for (int i = 1; i<src.rows; ++i)
for (int j = 1; j < src.cols; ++j) {
if ((i - 1 >= 0) && (j - 1) >= 0 && (i + 1)<src.rows && (j + 1)<src.cols) {//边缘不进行处理
dst.at<Vec3b>(i, j)[0] = (src.at<Vec3b>(i, j)[0] + src.at<Vec3b>(i - 1, j - 1)[0] + src.at<Vec3b>(i - 1, j)[0] + src.at<Vec3b>(i, j - 1)[0] +
src.at<Vec3b>(i - 1, j + 1)[0] + src.at<Vec3b>(i + 1, j - 1)[0] + src.at<Vec3b>(i + 1, j + 1)[0] + src.at<Vec3b>(i, j + 1)[0] +
src.at<Vec3b>(i + 1, j)[0]) / 9;
dst.at<Vec3b>(i, j)[1] = (src.at<Vec3b>(i, j)[1] + src.at<Vec3b>(i - 1, j - 1)[1] + src.at<Vec3b>(i - 1, j)[1] + src.at<Vec3b>(i, j - 1)[1] +
src.at<Vec3b>(i - 1, j + 1)[1] + src.at<Vec3b>(i + 1, j - 1)[1] + src.at<Vec3b>(i + 1, j + 1)[1] + src.at<Vec3b>(i, j + 1)[1] +
src.at<Vec3b>(i + 1, j)[1]) / 9;
dst.at<Vec3b>(i, j)[2] = (src.at<Vec3b>(i, j)[2] + src.at<Vec3b>(i - 1, j - 1)[2] + src.at<Vec3b>(i - 1, j)[2] + src.at<Vec3b>(i, j - 1)[2] +
src.at<Vec3b>(i - 1, j + 1)[2] + src.at<Vec3b>(i + 1, j - 1)[2] + src.at<Vec3b>(i + 1, j + 1)[2] + src.at<Vec3b>(i, j + 1)[2] +
src.at<Vec3b>(i + 1, j)[2]) / 9;
}
else {//边缘赋值
dst.at<Vec3b>(i, j)[0] = src.at<Vec3b>(i, j)[0];
dst.at<Vec3b>(i, j)[1] = src.at<Vec3b>(i, j)[1];
dst.at<Vec3b>(i, j)[2] = src.at<Vec3b>(i, j)[2];
}
}
}
//图像椒盐化
void salt(Mat &image, int num) {
if (!image.data) return;//防止传入空图
int i, j;
srand(time(NULL));
for (int x = 0; x < num; ++x) {
i = rand() % image.rows;
j = rand() % image.cols;
image.at<Vec3b>(i, j)[0] = 255;
image.at<Vec3b>(i, j)[1] = 255;
image.at<Vec3b>(i, j)[2] = 255;
}
}
void main() {
Mat image = imread("路飞.jpg");
Mat Salt_Image;
image.copyTo(Salt_Image);
salt(Salt_Image, 3000);
Mat image1(image.size(), image.type());
Mat image2;
AverFiltering(Salt_Image, image1);
blur(Salt_Image, image2, Size(3, 3));//openCV库自带的均值滤波函数
imshow("原图", image);
imshow("自定义均值滤波", image1);
imshow("openCV自带的均值滤波", image2);
waitKey();
}
レンダリング:
あなたは絵ブラーを参照し、ノイズ、それだけの絵でぼかしアルゴリズムを除去するのに非常に効果的ではないことができます。
II。メディアンフィルタリング
まず、値を確認します。{1,4,6,8,9}の数字の系列では、6は単に数字の列です。このことから、画像処理に適用することができます。我々はまだ我々は9画素をソートし、最終的に9つのピクセル値のため、この割り当て行列の中心点になる、9つの画素を有する画像マトリックス3 * 3、に行きます。
コード:
//求九个数的中值
uchar Median(uchar n1, uchar n2, uchar n3, uchar n4, uchar n5,
uchar n6, uchar n7, uchar n8, uchar n9) {
uchar arr[9];
arr[0] = n1;
arr[1] = n2;
arr[2] = n3;
arr[3] = n4;
arr[4] = n5;
arr[5] = n6;
arr[6] = n7;
arr[7] = n8;
arr[8] = n9;
for (int gap = 9 / 2; gap > 0; gap /= 2)//希尔排序
for (int i = gap; i < 9; ++i)
for (int j = i - gap; j >= 0 && arr[j] > arr[j + gap]; j -= gap)
swap(arr[j], arr[j + gap]);
return arr[4];//返回中值
}
//图像椒盐化
void salt(Mat &image, int num) {
if (!image.data) return;//防止传入空图
int i, j;
srand(time(NULL));
for (int x = 0; x < num; ++x) {
i = rand() % image.rows;
j = rand() % image.cols;
image.at<Vec3b>(i, j)[0] = 255;
image.at<Vec3b>(i, j)[1] = 255;
image.at<Vec3b>(i, j)[2] = 255;
}
}
//中值滤波函数
void MedianFlitering(const Mat &src, Mat &dst) {
if (!src.data)return;
Mat _dst(src.size(), src.type());
for(int i=0;i<src.rows;++i)
for (int j=0; j < src.cols; ++j) {
if ((i - 1) > 0 && (i + 1) < src.rows && (j - 1) > 0 && (j + 1) < src.cols) {
_dst.at<Vec3b>(i, j)[0] = Median(src.at<Vec3b>(i, j)[0], src.at<Vec3b>(i + 1, j + 1)[0],
src.at<Vec3b>(i + 1, j)[0], src.at<Vec3b>(i, j + 1)[0], src.at<Vec3b>(i + 1, j - 1)[0],
src.at<Vec3b>(i - 1, j + 1)[0], src.at<Vec3b>(i - 1, j)[0], src.at<Vec3b>(i, j - 1)[0],
src.at<Vec3b>(i - 1, j - 1)[0]);
_dst.at<Vec3b>(i, j)[1] = Median(src.at<Vec3b>(i, j)[1], src.at<Vec3b>(i + 1, j + 1)[1],
src.at<Vec3b>(i + 1, j)[1], src.at<Vec3b>(i, j + 1)[1], src.at<Vec3b>(i + 1, j - 1)[1],
src.at<Vec3b>(i - 1, j + 1)[1], src.at<Vec3b>(i - 1, j)[1], src.at<Vec3b>(i, j - 1)[1],
src.at<Vec3b>(i - 1, j - 1)[1]);
_dst.at<Vec3b>(i, j)[2] = Median(src.at<Vec3b>(i, j)[2], src.at<Vec3b>(i + 1, j + 1)[2],
src.at<Vec3b>(i + 1, j)[2], src.at<Vec3b>(i, j + 1)[2], src.at<Vec3b>(i + 1, j - 1)[2],
src.at<Vec3b>(i - 1, j + 1)[2], src.at<Vec3b>(i - 1, j)[2], src.at<Vec3b>(i, j - 1)[2],
src.at<Vec3b>(i - 1, j - 1)[2]);
}
else
_dst.at<Vec3b>(i, j) = src.at<Vec3b>(i, j);
}
_dst.copyTo(dst);//拷贝
}
void main() {
Mat image = imread("路飞.jpg");
Mat Salt_Image;
image.copyTo(Salt_Image);
salt(Salt_Image, 3000);
Mat image3, image4;
MedianFlitering(Salt_Image, image3);
medianBlur(Salt_Image, image4, 3);
imshow("自定义中值滤波处理后", image3);
imshow("openCV自带的中值滤波", image4);
waitKey();
}
レンダリング:
我々は良い塩とコショウノイズが平滑化され、見ることができ、それはそのにじみがあまりにも深刻意味するものではありませんでした。
三パディング問題
画像フィルタは、フィルタに適用した場合、境界問題を処理することです。一般的に、治療法の三種類があります。
1.国境に対処するためではありません
画像を濾過しながら画像の境界は、任意の治療ではなく、フィルタは、画像の周辺部に印加されないので、画像の周辺部には変化されません。
2.充填0
画像の境界線の拡張、ゼロ充てん拡張境界を行うには、2K + 1のための正方形のフィルタで、拡張された境界のサイズがKである原画像が[M、N]である場合、その画像となる拡張[M + 2K、N + 2K]。フィルタリングの後、黒のボーダーの画像が表示されます。
最も近いピクセル値を記入3.
0膨張と同様の充填拡張が、充填、拡張延長部分的に充填された0であり、これは充填ピクセルに最も近い値です。
四つの概要:
平均値および中央値フィルタリングおよび滑らかな画像フィルタリングを再生できるが、ノイズ関数と考えられます。
平均フィルタ線形方法を使用して、ウィンドウ全体の範囲の平均画素値、平均値フィルタ自体は、また、画像の細部をノイズ除去画像を破壊しながら、十分に画像のディテールを保護することができない固有の欠点は、それによって、あります画像が不鮮明になり、適切にノイズの点を削除することはできません。平均フィルタは、より良いガウス雑音、塩、コショウ、ノイズの貧弱なパフォーマンスを行いました。
非線形メディアンフィルタ方法、塩、コショウノイズの良好な性能、滑らかなノイズパルスの点で非常に有効であり、それは、画像シャープなエッジを保護することができ、代わりに、汚染されたサイトの適切なポイント値を選択する、優れた効果ので、ガウス雑音のパフォーマンスの低下。
参考:
1.メディアンフィルタと平均値フィルタ