關於雜訊生成,我們可以使用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;網格25生成的影象: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,)
網格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 ...