#include <bits/stdc++.h>
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/video.hpp"
#include "opencv2/objdetect.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/ml.hpp"
#define inf 2333333333333333
#define N 2010
#define p(a) putchar(a)
#define For(i,a,b) for(int i=a;i<=b;++i)
typedef unsigned char uchar;
//by war
//2020.10.8
using namespace std;
using namespace cv;
int alpha_slider_r=1,alpha_slider_d=1,m,cnt;
char TrackbarNamed[50],TrackbarNamer[50];
Mat image,image0,image1,new_image,boxFilterDst;
double Sum,sigma_d,sigma_r,alpha_d,alpha_r,alpha_slider_max=100,eps=1e-7;
double kel[N][N];
void in(int &x){
int y=1;char c=getchar();x=0;
while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();}
while(c<='9'&&c>='0'){ x=(x<<1)+(x<<3)+c-'0';c=getchar();}
x*=y;
}
void o(int x){
if(x<0){p('-');x=-x;}
if(x>9)o(x/10);
p(x%10+'0');
}
void on_trackbar(int, void*){
alpha_d = (double) alpha_slider_d/(double) 10.0;
if(1.0/6.0 - alpha_d>eps) alpha_d=1.0/6.0;
sigma_d=alpha_d;
alpha_r = (double) alpha_slider_r/(double) 10.0;
if(1.0/6.0 - alpha_r>eps) alpha_r=1.0/6.0;
sigma_r=alpha_r;
m=6.0*sigma_d-1;
m+=(m%2==0);
// copyMakeBorder(image, image0, m/2, m/2, m/2, m/2, BORDER_REFLECT);
// new_image = Mat::zeros(image.size(), image.type());
// For(i,0,image.rows-1)
// For(j,0,image.cols-1)
// For(k,0,2){
// cnt=0;Sum=0;
// For(h,i,i+m-1)
// For(w,j,j+m-1){
// kel[h][w]=exp((-1.0)/(2.0*sigma_d*sigma_d)*((h-(i+m/2))*(h-(i+m/2))+(w-(j+m/2))*(w-(j+m/2))));
// kel[h][w]*=exp((-1.0)/(2.0*sigma_r*sigma_r)*(image.at<Vec3b>(h,w)[k]-image.at<Vec3b>(i+m/2,j+m/2)[k])*(image.at<Vec3b>(h,w)[k]-image.at<Vec3b>(i+m/2,j+m/2)[k]));
// Sum+=kel[h][w];
// }
// For(h,i,i+m-1)
// For(w,j,j+m-1){
// kel[h][w]/=Sum;
// }
// Sum=0;
// For(h,i,i+m-1)
// For(w,j,j+m-1){
// Sum+=image0.at<Vec3b>(h,w)[k]*kel[h][w];
// }
// new_image.at<Vec3b>(i,j)[k]=Sum;
// }
// imshow("Contrast", new_image);
//cout<<sigma_d<<" "<<sigma_r<<endl;
//bilateralFilter(image, image1, m, sigma_d*10, sigma_r*10);
//imshow("Contrast", image1);
boxFilter(image, boxFilterDst, -1, cv::Size(m, m));
imshow("Contrast", boxFilterDst);
}
signed main(){
image = imread("/Users/war/Downloads/08.jpg");
namedWindow("Contrast", 1);
sprintf(TrackbarNamed, "d -> %lf", alpha_slider_max);
sprintf(TrackbarNamer, "r -> %lf", alpha_slider_max);
createTrackbar(TrackbarNamed, "Contrast", &alpha_slider_d, alpha_slider_max, on_trackbar);
on_trackbar( alpha_slider_d, 0 );
createTrackbar(TrackbarNamer, "Contrast", &alpha_slider_r, alpha_slider_max, on_trackbar);
on_trackbar( alpha_slider_r, 0 );
waitKey(0);
return 0;
}