手把手教你OpenCV常见滤波(高斯,中值,均值)C++

目录

1 图像处理中的高斯函数

1.1一维高斯函数

1.2二维高斯函数

1.3 代码

1.4 结果

2 低通滤波之均值滤波器

2.1、空间滤波基础

2.1.1线性空间滤波原理

2.1.2 相关与卷积

2.2、平滑滤波之均值滤波器

2.2.1原理

2.2.2 c++ opencv代码

2.2.3  结果

3 中值滤波

3.1 c++ opencv代码

3.2  结果


1 图像处理中的高斯函数

1.1一维高斯函数

在统计学与概率论中,高斯函数是正态分布(高斯分布)的密度函数。一维高斯表达式如下:

其中,其中a、b与 c为实数常数,且a > 0.
a表示得到曲线的高度;
b(μ)是指曲线在x轴的中心;
c(σ)指width(与半峰全宽有关);

1.2二维高斯函数

二维高斯表达式:

1.3 代码

噪声程序.h文件:

#pragma once
#include<iostream>
#include<opencv2/opencv.hpp>
#include <random>


using namespace cv;
using namespace std;

void Salt(Mat image, int n);

噪声程序.cpp文件:

#include "Salt.h"

void Salt(Mat image, int n)
{
	default_random_engine generater;
	uniform_int_distribution<int>randomRow(0, image.rows - 1);
	uniform_int_distribution<int>randomCol(0, image.cols - 1);

	int i, j;
	for (int k = 0; k < n; k++)
	{
		i = randomCol(generater);
		j = randomRow(generater);
		if (image.channels() == 1)
		{
			image.at<uchar>(j, i) = 255;
		}
		else if (image.channels() == 3)
		{
			image.at<Vec3b>(j, i)[0] = 255;
			image.at<Vec3b>(j, i)[1] = 255;
			image.at<Vec3b>(j, i)[2] = 255;
		}
	}
}

主函数:

#include<iostream>
#include<opencv2/opencv.hpp>
#include"Salt.h"

using namespace cv;
using namespace std;

//定义高斯滤波函数
void myfilter(int filter_size, Mat& image_input, Mat& image_output);

int main()
{
	Mat image, image_gray, image_output, image_output2;   //定义输入图像,灰度图像,输出图像
	image = imread("./img_all/2.png");  //读取图像;
	if (image.empty())
	{
		cout << "读取错误" << endl;
		return -1;
	}
	imshow("image", image);

	cvtColor(image, image_gray, COLOR_BGR2GRAY);
	Salt(image_gray, 1000);   //添加噪声
	imshow("image_gray", image_gray);

	//opencv自带高斯滤波函数
	int a = 7;
	GaussianBlur(image_gray, image_output, Size(a, a), 2, 2);
	imshow("image_output", image_output);


	waitKey(0);  //暂停,保持图像显示,等待按键结束
	return 0;
}

1.4 结果

2 低通滤波之均值滤波器

2.1、空间滤波基础

2.1.1线性空间滤波原理

线性空间滤波器在图像f和滤波器核w之间执行乘积之和运算。用邻域像素改变中心像素的灰度值大小。

2.1.2 相关与卷积

相关以上面的滤波运算方法对图像进行遍历处即使w每个像素能够访问图像f中每个像素。卷积运算时将滤波器核w旋转180°再处理。

2.2、平滑滤波之均值滤波器

2.2.1原理

均值滤波就是将区域内的像素灰度值的平均值作为中心像素的灰度值,一个3*3大小的均值滤波器核如下:

2.2.2 c++ opencv代码

主程序:

#include<iostream>
#include<opencv2/opencv.hpp>
#include"Salt.h"

using namespace cv;
using namespace std;



int main()
{
	Mat image, image_gray, image_output, image_output2;   //定义输入图像,灰度图像,输出图像
	image = imread("./img_all/2.png");  //读取图像;
	if (image.empty())
	{
		cout << "读取错误" << endl;
		return -1;
	}
	imshow("image", image);

	cvtColor(image, image_gray, COLOR_BGR2GRAY);
	Salt(image_gray, 1000);   //添加噪声
	imshow("image_gray", image_gray);


	//opencv自带程序
	blur(image_gray, image_output, Size(7, 7));

	imshow("image_output", image_output);

	waitKey(0);  //暂停,保持图像显示,等待按键结束
	return 0;
}
2.2.3  结果

3 中值滤波

中值滤波就是取周围邻域像素灰度值值的中值作为中心像素灰度值结果。

3.1 c++ opencv代码

主程序:

#include<iostream>
#include<opencv2/opencv.hpp>
#include"Salt.h"

using namespace cv;
using namespace std;


int main()
{
	Mat image, image_gray, image_output, image_output2;   //定义输入图像,灰度图像,输出图像
	image = imread("./img_all/2.png");  //读取图像;
	if (image.empty())
	{
		cout << "读取错误" << endl;
		return -1;
	}
	imshow("image", image);

	cvtColor(image, image_gray, COLOR_BGR2GRAY);
	Salt(image_gray, 1000);   //添加噪声
	imshow("image_gray", image_gray);

	//opencv自带滤波函数
	int a = 7;
	medianBlur(image_gray, image_output, a);
	imshow("image_output", image_output);



	waitKey(0);  //暂停,保持图像显示,等待按键结束
	return 0;
}

3.2  结果

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值