首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

OpenCV 實戰:Perlin Noise 柏林噪聲生成與雲霧效果實現

     編輯:關於C++

什麼是 Perlin Noise?

Perlin Noise 是一種梯度噪聲算法,由 Ken Perlin 於 1983 年發明,廣泛用於程序化紋理生成(雲霧、地形、大理石紋理等)。其核心思想:在整數格點生成隨機梯度向量,通過插值平滑過渡,產生自然、連續的偽隨機圖案。

算法核心流程

  1. 基礎噪聲生成:使用 cv::randn 生成高斯分布的基礎噪聲圖。
  2. 多八度疊加:不同頻率(頻率倍增)與振幅(振幅衰減)的噪聲層疊加,模擬自然界多尺度細節。
  3. 平滑插值:採用餘弦插值而非線性插值,消除塊狀伪影,獲得更自然的過渡。
  4. 歸一化輸出:將疊加結果映射到 [0,1] 或 [0,255] 範圍供顯示。

關鍵代碼解析

// 核心參數
float persistence = 0.8f;      // 振幅衰減因子
int octaveCount = 8;           // 八度數(層數)

// 餘弦插值函數
float Cosine_Interpolate(float x1, float x2, float alpha) {
    float ft = alpha * CV_PI;
    float f = (1 - cos(ft)) * 0.5f;
    return x1 * (1 - f) + x2 * f;
}

// 生成平滑噪聲(雙線性插值)
void Generate_smoothnoise(Mat& src, Mat& dst, int octave) {
    int samplePeriod = 1 << octave;          // 2^octave
    float sampleFrequency = 1.0f / samplePeriod;
    for (int i = 0; i < src.rows; ++i) {
        for (int j = 0; j < src.cols; ++j) {
            // 計算四個角點索引與插值權重
            // ... 雙線性插值邏輯 ...
            // 使用 Cosine_Interpolate 進行水平、垂直兩次插值
        }
    }
}

// 主循環疊加八度
for (int o = 0; o < octaveCount; ++o) {
    Generate_smoothnoise(Base_Noise, Cloud_Temp, o);
    float amplitude = pow(persistence, octaveCount - o);
    Cloud += Cloud_Temp * amplitude;
    totalAmplitude += amplitude;
}
Cloud /= totalAmplitude;  // 歸一化

效果展示

原圖

Perlin Noise 效果圖

工程應用提示

  • 參數 persistence 控制細節豐富度:值越大,高頻細節保留越多。
  • octaveCount 決定細節層級:地形生成常用 6-10,實時渲染可降低至 3-4。
  • 可擴展為 3D 噪聲用於體積雲、地形侵蝕模擬等進階應用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved