c++ opencv数字图像处理:低通滤波之高斯滤波器

文章目录

  • 前言
  • 一、图像处理中的高斯函数
    • 1.一维高斯函数
    • 2.二维高斯函数
  • 二、高斯滤波器
    • 1.程序


前言

数字图像处理c++ opencv(VS2019 opencv4.53)持续更新


一、图像处理中的高斯函数

1.一维高斯函数

在统计学与概率论中,高斯函数是正态分布(高斯分布)的密度函数。一维高斯表达式如下:
在这里插入图片描述
其中,其中a、b与 c为实数常数,且a > 0.
a表示得到曲线的高度;
b(μ)是指曲线在x轴的中心;
c(σ)指width(与半峰全宽有关);
c++ opencv数字图像处理:低通滤波之高斯滤波器_第1张图片


2.二维高斯函数

二维高斯表达式:
在这里插入图片描述
c++ opencv数字图像处理:低通滤波之高斯滤波器_第2张图片
高斯函数在空间域和频率域常作为低通滤波器核。


二、高斯滤波器

1.程序

代码如下(示例):

#include
#include
#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("lena.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);

	//自编函数
    myfilter(a, image_gray, image_output2);
    imshow("image_output2", image_output2);

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


void myfilter(int filter_size, Mat& image_input, Mat& image_output) //图像边缘未处理
{
	image_output = image_input.clone();
	int k = (filter_size - 1) / 2;

	for (int i = k; i < (image_input.rows-k); i++)
	{
		for (int j = k; j < (image_input.cols - k); j++)
		{
			double sum = 0.0;
			double sum1 = 0.0;
			double sigma = 7; //可调
			double g;
			for (int m = -k; m < k + 1; m++)
			{
				for (int n = -k; n < k + 1; n++)
				{
					g = exp(-(m * m + n * n) / (2 * sigma * sigma));  
					sum = sum + g*image_input.at<uchar>(i + m, j + n);
					sum1 = sum1 + g;
				}
			}
			image_output.at<uchar>(i, j) = (int)round(sum / sum1);

		}
	}
}

噪声程序.h文件

#pragma once
#include
#include
#include 


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;
		}
	}
}

结果:
c++ opencv数字图像处理:低通滤波之高斯滤波器_第3张图片

你可能感兴趣的:(图像处理2(c++,opencv),c++,opencv,计算机视觉)