加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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);

}


原图?


效果图

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读