void OpenCVPicture::colorDistortion(RNG &rng, int sigma1, int sigma2, int sigma3, int sigma4) { // Call as a final preprocessing step, after any affine transforms and // jiggling. assert(mat.type() % 8 == 5); // float std::vector<float> delta1(mat.channels()); std::vector<float> delta2(mat.channels()); std::vector<float> delta3(mat.channels()); std::vector<float> delta4(mat.channels()); for (int j = 0; j < mat.channels(); j++) { delta1[j] = rng.normal(0, sigma1); delta2[j] = rng.normal(0, sigma2); delta3[j] = rng.normal(0, sigma3); delta4[j] = rng.normal(0, sigma4); } float *matData = ((float *)(mat.data)); for (int y = 0; y < mat.rows; y++) { for (int x = 0; x < mat.cols; x++) { int j = x * mat.channels() + y * mat.channels() * mat.cols; bool interestingPixel = false; for (int i = 0; i < mat.channels(); i++) if (std::abs(matData[i + j] - backgroundColor) > 2) interestingPixel = true; if (interestingPixel) { for (int i = 0; i < mat.channels(); i++) matData[i + j] += delta1[i] + delta2[i] * (matData[i + j] - backgroundColor) + delta3[i] * (x - mat.cols / 2) + delta4[i] * (y - mat.rows / 2); } } } }
main(int argc, char* argv[]){ static vec u(K+1); int k,n; std::string op=argv[1]; // command line argument val dx=1.0/K, dt=T/N, dx4=dx*dx*dx*dx, xk, tn; // discretization variables // Initialize for(k=0;k<=K;k++){ xk=k*dx; u(k)=f(xk); } if(op=="plot") printf("set terminal x11 noraise\nset yrange [-5:5]\nset style data lines\n\n"); val rho=NU*dt/dx4; // rho = nu*dt/dx^4 vec temp(K+1); temp=u; for(n=0;n<=N;n++){ tn=n*dt; u=temp; for(k=0;k<=K;k++){ xk=k*dx; temp(k) = u(k) - rho*delta4(u,k); //printu(u,tn,xk,K); } if(op=="plot0") plot0(u, tn, K-1, N); if(op=="plot1") plot1(u, tn, K-1, N); if(op=="plot3d") plot3d(u, tn, K-1, N); if(op=="approx") output(tn, 0.5, u(K/2), K-1, N); } return 0; }
void distortImageColor(cv::Mat& mat, RNG& rng, float sigma1, float sigma2, float sigma3, float sigma4) { std::vector<float> delta1(mat.channels()); std::vector<float> delta2(mat.channels()); std::vector<float> delta3(mat.channels()); std::vector<float> delta4(mat.channels()); for (int j=0;j<mat.channels();j++) { delta1[j]=rng.normal(0,sigma1); delta2[j]=rng.normal(0,sigma2); delta3[j]=rng.normal(0,sigma3); delta4[j]=rng.normal(0,sigma4); } int j=0; for (int y=0;y<mat.rows;++y) { for (int x=0;x<mat.cols;++x) { for (int i=0;i<mat.channels();++i) { mat.ptr()[j]=std::max(0,std::min(255, (int)(mat.ptr()[j]+ delta1[i]+ delta2[i]*cos(mat.ptr()[j]*3.1415926535/255)+ delta3[i]*(x-mat.cols/2)+ delta4[i]*(y-mat.rows/2)))); ++j; } } } }
int main(){ static vec u(K+1), un(K+1); val dt = T/N; val dx = 1.0/K; val gam = MU*dt/(dx*dx); val rho = NU*dt/(dx*dx*dx*dx); val ar = dt/(2*dx); int j,n=1; //Initialize U for (j=0;j<K+1;j++) u(j)=f(j*dx); //printf("Initial vector\n"); vecprintf(u,K); val tn = n*dt; while (tn<=T||n<N){ for (j=0;j<K+1;j++) un(j) = u(j) - gam*delta2(u,j) - rho*delta4(u,j) - ar*u(j)*delta0(u,j); for (j=0;j<K+1;j++) u(j) = un(j); n+=1; tn = n*dt; } printf("At t = 0.25 and space 0.5 the 'heat' is %24.15e\n", u(K/2)); return 0; }