matlab練習程式(柏林雜訊)

2022-06-08 19:27:08 字數 1970 閱讀 6264

關於雜訊生成,我們可以使用rand(256)這樣的函式生成256*256大小的隨機雜訊,這樣的雜訊我們稱為白雜訊。

不過白雜訊過於隨機,有時候並不能反映真實的雜訊,比如山丘,紋理等不那麼「隨機」的起伏。

因此有人開發了柏林雜訊,該雜訊在圖形學中的地形,雲彩或火焰生成等方法中經常使用。

下面介紹下演算法過程:

1. 首先定義網格大小和待生成影象的大小。

2. 對網格每乙個頂點生成隨機方向向量,就是下圖紅色的向量。

3. 遍歷影象每乙個畫素,計算該畫素到該畫素所在網格四個頂點組成的向量d,就是下圖右邊藍色的向量。

4. 計算網格頂點隨機方向向量與3中求得的向量d的點積,得到方向權重。

5. 利用平滑函式對dx、dy平滑,得到比例係數sx、sy。平滑函式要符合f(0) = 0,f(0.5)=0.5,f(1)=1的方程,最好滿足二階導數連續。

6. 根據方向權重與平滑函式得到的係數對當前畫素賦值。

matlab**如下:

clear all;close all;clc;

n = 256; %雜訊影象大小

cellsize = 10; %網格大小,不同的大小會產生不同尺度的雜訊

g = rand(2,n/cellsize+2,n/cellsize+2)-0.5; %每個網格頂點的隨機方向向量

img =zeros(n);

for i=1

:n

for j=1

:n indi = i/cellsize+1

;

indj = j/cellsize+1

;

floori =floor(indi);

floorj =floor(indj);

d00 = [indi indj] - [floori floorj]; %計算當前點到當前網格四個角點距離

d10 = [indi indj] - [floori+1

floorj];

d01 = [indi indj] - [floori floorj+1

]; d11 = [indi indj] - [floori+1 floorj+1

];

s = sum(g(:,floori,floorj).*d00'

); %當前網格四個角點方向向量對當前點的方向權重

t = sum(g(:,floori+1,floorj).*d10'

); u = sum(g(:,floori,floorj+1).*d01'

); v = sum(g(:,floori+1,floorj+1).*d11'

);dx = indi -floori;

dy = indj -floorj;

sy = 6*dy.^5-15*dy.^4+10*dy.^3; %符合f(0) = 0,f(0.5)=0.5,f(1)=1的方程,滿足二階導數連續

sx = 6*dx.^5-15*dx.^4+10*dx.^3; %用於描述網格內的起伏

a = s + (t-s)*sx;

b = u + (v-u)*sx;

img(i,j) = a + (b-a)*sy;

endend

imshow(img,)

網格25生成的影象:

網格10生成的影象:

最後不同網格尺度生成的雜訊也能夠進行疊加,得到更多種類的雜訊。

參考:

Perlin Noise 柏林雜訊

1.簡介 柏林雜訊最常用且最著名的雜訊,名字源於他的創始人ken perlin。柏林雜訊與值雜訊相似,定義若干個頂點且每個頂點含有乙個隨機梯度向量,這些定點會根據自己的梯度向量對周圍座標產生是能影響,沿著頂點的梯度方向越上公升則勢能越高。當需要求出某個座標的輸出值時,需要將該座標附近的各個頂點所造成...

Matlab白雜訊高斯雜訊

實現書本 隨機控制 上關於生成高斯白雜訊的方法。白雜訊就是標準均勻分布偽隨機數列。1.標準均勻分布函式,均值1 2,方差1 12 x1 1973 y zeros 1,500 for i 1 500 x1 mod 91 x1,10 4 y 1,i x1 10000 end stem y xlabel ...

雜訊種類及Matlab新增雜訊

1 高斯雜訊 源於電子電路雜訊和由低照明度或高溫帶來的感測器雜訊 可通過空域濾波的平滑或影象復原技術來消除 通過均值和方差產生高斯雜訊 i uint8 100 ones 256 256 均值為100 j imnoise i,gaussian 0 0.01 高斯雜訊 方差0.01 k imnoise ...