#include <QCoreApplication>
#include <iostream>
#include <fstream>
#include <opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#define _USE_MATH_DEFINES
#include <math.h>
//#define M_PI 3.14159265358979323846
int main(int argc, char *argv[])
{
cv::Mat srcImage = cv::imread("./test.jpg",cv::IMREAD_COLOR);
int width = srcImage.rows;
int height = srcImage.cols;
cv::Mat dstImage = cv::Mat::zeros(height,width,CV_8UC3);
//Prepare kernel
double s = 1.3;
int k_size = 3;
int p = floor(k_size / 2);
int x = 0, y = 0;
double k_sum = 0;
// float k[k_size][k_size];
float k[3][3];
//初始化一个高斯核
for (int j = 0; j < k_size; j++)
{
for (int i = 0; i < k_size; i++)
{
y = j - p;
x = i - p;
//正态高斯函数
k[j][i] = 1 / (s*sqrt(2 * M_PI)) * exp(-(x*x + y*y) / (2*s*s));
k_sum += k[j][i];
}
}
//归一化
for (int j = 0; j < k_size;j++)
{
for (int i = 0; i < k_size; i++)
{
k[j][i] /= k_sum;
}
}
//filtering
double v = 0;
for (int j = 0; j < height;j++)
{
for (int i = 0 ; i < width ; i++)
{
for (int c = 0; c<3; c++)
{
v = 0;
for (int _j = -p;_j < p+1;_j++)
{
for (int _i = -p;_i < p+1;_i++)
{
if(((j+_j) >= 0) && ((i + _i) >= 0))
{
v += (double)srcImage.at<cv::Vec3b>(j+_j,i+_i)[c]*k[_j + p][_i + p];
}
}
}
dstImage.at<cv::Vec3b>(j,i)[c] = v;
}
}
}
cv::imshow("SrcImage",srcImage);
cv::imshow("DstImage",dstImage);
std::cout << "END!" << std::endl;
cv::waitKey(0);
return 0;
}