OpenCV——Perlin Noise
发布时间:2020-12-15 23:39:36 所属栏目:大数据 来源:网络整理
导读:// define head function#ifndef PS_ALGORITHM_H_INCLUDED#define PS_ALGORITHM_H_INCLUDED#include iostream#include string#include "cv.h"#include "highgui.h"#include "cxmat.hpp"#include "cxcore.hpp"#include "math.h"using namespace std;using nam
// define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include <iostream> #include <string> #include "cv.h" #include "highgui.h" #include "cxmat.hpp" #include "cxcore.hpp" #include "math.h" using namespace std; using namespace cv; void Show_Image(Mat&,const string &); #endif // PS_ALGORITHM_H_INCLUDED /* perlin noise. */ #include "PS_Algorithm.h" #include <time.h> using namespace std; using namespace cv; void Generate_smoothnoise(Mat& src,Mat& std,int octave); float Cosine_Interpolate(float x1,float x2,float alpha); #define pi 3.1415926 int main() { string Img_name("4.jpg"); Mat Img; Img=imread(Img_name); Mat Cloud(Img.size(),CV_32FC1); Mat Cloud_Temp(Img.size(),CV_32FC1); Mat Base_Noise(Img.size(),CV_32FC1); cv::randn(Base_Noise,0.5,0.25); // Show_Image(Base_Noise,"N1"); float persistance = 0.8; float totalAmplitude = 0.0; float amplitude; int octaveCount=8; for (int i=0; i<octaveCount; i++) { amplitude=std::pow(persistance,(octaveCount-i)); totalAmplitude=totalAmplitude+amplitude; Generate_smoothnoise(Base_Noise,Cloud_Temp,i); Cloud=Cloud+Cloud_Temp*amplitude; } Cloud=Cloud/totalAmplitude; Show_Image(Cloud,"out.jpg"); imwrite("Out.jpg",Cloud*255); waitKey(); } void Generate_smoothnoise(Mat& src,Mat& dst,int octave) { src.copyTo(dst); int width=src.cols; int height=src.rows; float samplePeriod=pow(2,octave); float sampleFrequency=1/samplePeriod; int sample_i0,sample_i1; float vertical_blend,horizontal_blend; int sample_j0,sample_j1; float top,bottom; for (int i=0; i<height-1; i++) { sample_i0=(int)(i/samplePeriod)*samplePeriod; sample_i1=(int)(sample_i0+samplePeriod)%height; vertical_blend = (i - sample_i0) * sampleFrequency; for (int j=0; j<width-1; j++) { sample_j0 = (int)(j / samplePeriod) * samplePeriod; sample_j1 = (int)(sample_j0 + samplePeriod)% width; horizontal_blend = (j - sample_j0) * sampleFrequency; if (sample_i0<0) sample_i0=0; if (sample_j0<0) sample_j0=0; if (sample_i1<0) sample_i1=0; if (sample_j1<0) sample_j1=0; // blend the top two corners top = Cosine_Interpolate(src.at<float>(sample_i0,sample_j0),src.at<float>(sample_i0,sample_j1),horizontal_blend); // blend the bottom two corners bottom = Cosine_Interpolate(src.at<float>(sample_i1,src.at<float>(sample_i1,horizontal_blend); // final blend dst.at<float>(i,j) = Cosine_Interpolate(top,bottom,vertical_blend); } } } float Cosine_Interpolate(float x1,float alpha) { float ft,f; float y; ft = alpha * pi; f = (1 - cos(ft)) * .5; y=x1*(1-f)+x2*f; return y; } // define the show image #include "PS_Algorithm.h" #include <iostream> #include <string> using namespace std; using namespace cv; void Show_Image(Mat& Image,const string& str) { namedWindow(str.c_str(),CV_WINDOW_AUTOSIZE); imshow(str.c_str(),Image); } 原图? 效果图 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |