#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 100010 #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=1,m,cnt; char TrackbarName[50]; Mat image,image0,image1,new_image; double sigma,alpha,alpha_slider_max=100,eps=1e-7; double kel[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 = (double) alpha_slider/(double) 10.0; if(1.0/6.0 - alpha>eps) alpha=1.0/6.0; sigma=alpha; m=6.0*sigma-1; m+=(m%2==0); copyMakeBorder(image, image0, m/2, m/2, m/2, m/2, BORDER_REFLECT); //imshow("Contrast", image0); image1 = image0; double sum=0; For(i,1,m){ kel[i]=exp(1.0/(2.0*sigma*sigma)*(i-(m+1)/2)*(i-(m+1)/2)*(-1.0)); sum+=kel[i]; } For(i,1,m) kel[i]/=sum; For(i,0,image.rows-1)//先处理列方向 For(j,0,image.cols-1) For(k,0,2){ cnt=0;sum=0; For(t,j,j+m-1){ sum+=image0.at<Vec3b>(i+m/2,t)[k]*kel[++cnt]; } image1.at<Vec3b>(i+m/2,j+m/2)[k]=sum; } 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(t,i,i+m){ sum+=image1.at<Vec3b>(t,j+m/2)[k]*kel[++cnt]; } new_image.at<Vec3b>(i,j)[k]=sum; } imshow("Contrast", new_image); } signed main(){ image = imread("/Users/war/Downloads/nk.jpg"); namedWindow("Contrast", 1); sprintf(TrackbarName, "Contrast -> %lf", alpha_slider_max); createTrackbar(TrackbarName, "Contrast", &alpha_slider, alpha_slider_max, on_trackbar); on_trackbar( alpha_slider, 0 ); waitKey(0); return 0; }