基于opencv的图像滤波处理

这里介绍几种图像滤波处理。

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滤波器:多用于边缘检测

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV是一个强大的计算机视觉库,其中包含许多用于图像处理滤波的函数。以下是一些基于OpenCV图像滤波技术: 1. 均值滤波:使用一个固定大小的卷积核来计算像素周围区域的均值,从而平滑图像并减少噪声。 2. 中值滤波:使用一个固定大小的卷积核来计算像素周围区域的中值,从而平滑图像并减少噪声。这种滤波器对于去除椒盐噪声非常有效。 3. 高斯滤波:使用一个固定大小的卷积核来计算像素周围区域的加权平均值,其中权重基于高斯分布。这种滤波器可以平滑图像并减少噪声,同时保留边缘信息。 4. 双边滤波:类似于高斯滤波,但是加入了一个额外的参数,用于调整平滑和边缘保留之间的权衡。这种滤波器可以平滑图像并减少噪声,同时保留边缘信息。 下面是一个使用OpenCV进行均值滤波的示例代码: ``` python import cv2 # 读取图像 img = cv2.imread('image.jpg') # 进行均值滤波 blur = cv2.blur(img, (5, 5)) # 显示图像 cv2.imshow('Original image', img) cv2.imshow('Blurred image', blur) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上面的代码中,我们首先使用cv2.imread()函数读取一张图像,然后使用cv2.blur()函数进行均值滤波。最后,我们使用cv2.imshow()函数显示原始图像滤波后的图像,并使用cv2.waitKey()和cv2.destroyAllWindows()函数等待用户按下任意键并关闭窗口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值