这里介绍几种图像滤波处理。
1.使用高斯滤波器对图像进行降噪吧!
这里用(3×3 大小,标准差 s=1.3)的高斯滤波器进行介绍。
权值 g(x,y,s) = 1/ (s*sqrt(2 * pi)) * exp( - (x^2 + y^2) / (2*s^2))
标准差 s = 1.3 的 8 近邻 高斯滤波器如下:
1 2 1
K = 1/16 [ 2 4 2 ]
1 2 1
准备过滤器:
float** k = new float*[k_size];//k_size为3,(3*3)
for (int i = 0; i < k_size; i++)
{
k[i] = new float[k_size];
}
for (int i = 0; i < k_size; i++)
{
for (int j = 0; j < k_size; j++)
{
x = i - p;
y = j - p;
k[i][j] = 1 / (s * sqrt(2 * pi)) * exp(-(x*x + y*y) / (2 * s*s));
//1 / (s * sqrt(2 * M_PI)) * exp( - (x*x + y*y) / (2*s*s));
k_sum += k[i][j];
}
}
for (int i = 0; i < k_size; i++) {
for (int j = 0; j < k_size; j++) {
k[i][j] /= k_sum;
}
}
导入我们需要处理的图片,初始化数据:
Mat src = imread("D:/7.27/opencvtest/opencvtest/line.png");
int p = floor(k_size / 2);
//获取图片的row和col
int h = img.rows;
int w = img.cols;
Mat out = Mat::zeros(img.size(), CV_8UC3);
开始进行处理
double v = 0;
//遍历每一个像素点
for (int row = 0; row < h; row++) {
for (int col = 0; col < w; col++) {
for (int c = 0; c < 3; c++) {
v = 0;
//像素点周边的像素值乘以权值,并累加赋值给该像素点。
for (int _row = -p; _row < p + 1; _row++) {
for (int _col = -p; _col < p + 1; _col++) {
if ((row + _row >= 0) && (col + _col >= 0)&&(row+_row<h)&&(col+_col<w)) {//相当于边缘补零
v += (double)img.at<Vec3b>(row + _row, col + _col)[c] * k[_row+p][_col+p];
}
}
}
out.at<Vec3b>(row, col)[c] = v;
}
}
}
2.
中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.
中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。
使用中值滤波器(3x 3大小)进行降噪处理吧!
中值滤波器是一种可以使图像平滑的滤波器。这种滤波器用滤波器范围内(在这里是3×3)。
这里的滤波器不需要进行准备,取中位数,可以使用数组,使用sort函数即可。操作形如上面的处理。
double v = 0;
int *vs=new int[k_size * k_size];
int count;
for (int row = 0; row < h; row++) {
for (int col = 0; col < w; col++) {
for (int c = 0; c < 3; c++) {
count = 0;
for (int _row = -p; _row < p + 1; _row++) {
for (int _col = -p; _col < p + 1; _col++) {
if ((row + _row >= 0) && (col + _col >= 0) && (row + _row<h) && (col + _col<w)) {
vs[count++] = (int)img.at<Vec3b>(row+_row, col+_col)[c];
}
}
}
std::sort(vs, vs + k_size * k_size);
out.at<Vec3b>(row, col)[c] = (uchar)vs[int(floor(count / 2)) + 1];
}
}
}
3.均值滤波,
均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度g(x,y),即g(x,y)=∑f(x,y)/m m为该模板中包含当前像素在内的像素总个数。
使用3\times33×3的均值滤波器来进行滤波吧!
均值滤波器使用网格内像素的平均值。
这里就不演示了,形如上面的,取平均值即可。
4.这里提供几种其他的滤波器:
motion滤波器:取对角线上的像素平均值。
MAX-MIN滤波器,网格内像素最大值与最小值得差值,可用作边缘检测。
差分滤波器:边缘检测
Sobel滤波器:多用于边缘检测