opencv 高斯滤波自己实现

本文展示了如何在C++中利用OpenCV库自定义实现高斯滤波器。通过`CreateMuban`函数创建高斯核,然后在`operateimage`函数中应用该核对图像进行滤波操作。实验中分别使用了不同标准差的高斯核对同一张图片进行处理,以观察不同参数下滤波效果的差异。
摘要由CSDN通过智能技术生成
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
double* CreateMuban(int iSize,double sigma)
{
double *gauss=new double[iSize];
int radius=(iSize-1)/2;
double MySigma=2*sigma*sigma;
double value=0;
for (int i = 0; i <iSize; i++)
{
gauss[i]=exp(-(i-radius)*(i-radius)/MySigma);
value=value+gauss[i];
}
for (int i = 0; i < iSize; i++)
{
gauss[i]=gauss[i]/value;
}
return gauss;
}
Mat operateimage(Mat _img,double*Muban,int iSize)
{
Mat img=_img;
Mat img1=_img;
Mat img2=_img;
int radius=(iSize-1)/2;
int r=0;
int g=0;
int b=0;
for (int i = (iSize+1)/2; i < img.rows-(iSize+1)/2; i++)
{
for (int j = (iSize+1)/2; j <img.cols-(iSize+1)/2; j++)
{
for (int k = 0; k < iSize; k++)
{
b=b+(img.at<Vec3b>(i,j-radius+k)[0])*Muban[k];
g=g+(img.at<Vec3b>(i,j-radius+k)[1])*Muban[k];
r=r+(img.at<Vec3b>(i,j-radius+k)[2])*Muban[k];
}
img1.at<Vec3b>(i,j)=Vec3b(b,g,r);
b=0;
g=0;
r=0;
}
}
for (int i = (iSize+1)/2; i < img1.cols-(iSize+1)/2; i++)
{
for (int j = (iSize+1)/2; j <img1.rows-(iSize+1)/2; j++)
{
for (int k = 0; k < iSize; k++)
{
b=b+(img1.at<Vec3b>(j-radius+k,i)[0])*Muban[k];
g=g+(img1.at<Vec3b>(j-radius+k,i)[1])*Muban[k];
r=r+(img1.at<Vec3b>(j-radius+k,i)[2])*Muban[k];
}
img2.at<Vec3b>(j,i)=Vec3b(b,g,r);
b=0;
g=0;
r=0;
}
}
return img2;
}
int main()
{
double* Muban=CreateMuban(3,0.01);
double* Muban1=CreateMuban(3,1);
Mat image=imread("Rpic0.jpg",1);
if (!image.data)
{
return -1;
}
Mat a;
image.copyTo(a);
Mat b;
image.copyTo(b);
Mat image1=operateimage(a,Muban,3);
Mat image2=operateimage(b,Muban1,3);
imshow("Guass",image1);
imshow("Guass1",image2);
imshow("原图",image);
waitKey(0);
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值