您的位置:首页 > 其它

Poission disk sampling

2015-11-25 20:22 239 查看

Poission disk sampling

标签(空格分隔):sunflower

1.泊松盘采样的优点

具有蓝色噪声频谱特征。与单纯的随机采样方法相比,这种方法在保持随机性的同时,使采样点的分布更加均匀,可以弥补随机采样的不足。
蓝色噪声频谱:描述随机类型特征的一个统计模型,其特点是主要**频率周围分布的其他频率值都非常小**,所以真值或者主频率很容易被检测到。这种特征很类似于点扩散函数,可以降低互相干噪声。


2.泊松盘采样实现步骤

算法参数:

Rn : 样本域为n维

r:样本之间的最小欧拉距离

k:样本选择常数

step 0

Generate Grid

初始化一个n维网格用来存储样本和加速空间搜索,并且选择网格的界限为r/sqrt(n),保证每个网格单元至少可以包含一个样本。所以网格可以看作是一个n维的整数数组:默认1表示没有样本,一个非负整数给出了粒子所在网格的索引。

step 1

Init

随机的选择一个最初的样本点,x0x0,把它映射到背景网格中,用来初始化有效列表(active_list)(样本目录数组),初始化样本,在acvtive_list中的索引为0。

step 2

Add or Remove

当active_list不是空的时候,可以从中随机选取一个索引(假设为i)。然后随机地在围绕这个点xi的球形环(内径为r,外径为2r)内选取k个点。每个点作一次循环,判断在围绕这个点半径为r的圆形范围内是否存在样本(使用网格背景用来查找最近的样本)。如果一个点充分远离已经存在的样本,那么就将这个点作为下一个样本,并把他加入到active_list。如果循环k次之后并没有找到下一个采样点,那么就将xi从active_list中移除。一直循环到active_list为空,这样,就完成了泊松盘采样。

%定义网格参数
clc
clear all
length = 100;  %定义网格的长和宽
width = 100;
r = 10;
cellsize = r/sqrt(2);%网格的边长
K = 30 ;%向外搜寻K次样本点
P_coor = cell(floor(length/cellsize)+1,floor(width/cellsize)+1);
length_max = floor(length/cellsize)+1;
width_max = floor(width/cellsize)+1;
xy0 = zeros(2,1);
xy0(1) = 100*rand;
xy0(2) = 100*rand;
Sam_xy = [xy0];
active_xy = [xy0];
P_coor{floor(xy0(1)/cellsize)+1,floor(xy0(2)/cellsize)+1} = xy0;
Sam_num = 0;%记录样本个数
active_flag = false;%是否删除样本标志位
while(~(isempty(active_xy)))
active_flag = false;%是否删除样本标志位

[row,column]=size(active_xy);
rand_column = randi(column);
p_c = active_xy(:,rand_column); %随机抽取一个样本
p_k = zeros(2,1);
for i= 1:K
R = r+r*rand;
T = 2*pi*rand;
p_k(1) = p_c(1) + R*cos(T);  %计算随机产生的周围可能的样本的坐标
p_k(2) = p_c(2) + R*sin(T);
p_k_x_cell =floor( p_k(1)/cellsize)+1;
p_k_y_cell = floor(p_k(2)/cellsize)+1;
A = false; B = false; C = false; D = false;
E = false; F = false; G = false; H = false;

if  (p_k_x_cell<1) || (p_k_x_cell>length_max) || (p_k_y_cell<1) || (p_k_y_cell>width_max)  %如果产生的样本超出了范围,则舍去
continue;
end
%          if isempty(P_coor{p_k_x_cell,p_k_y_cell})          %如果这点已经存在样本,那么则跳出本次循环
%          else
%              continue;
%          end
if  ~isempty(P_coor{p_k_x_cell,p_k_y_cell})          %如果这点已经存在样本,那么则跳出本次循环
continue;
end
%判断可能样本点的周围的八个小单元内是否有与它距离小于r的样本
if (p_k_x_cell -1> 0) && (p_k_y_cell -1>0)                                                           %判断A点
if isempty(P_coor{p_k_x_cell-1,p_k_y_cell-1})
A = true;
else
if dist_count(P_coor{p_k_x_cell-1,p_k_y_cell-1},p_k)>r
A = true;
end
end
end

if (p_k_x_cell > 0) && (p_k_y_cell -1>0)                                                                %判断B点
if isempty(P_coor{p_k_x_cell,p_k_y_cell-1})
B = true;
else
if dist_count(P_coor{p_k_x_cell,p_k_y_cell-1},p_k)>r
B = true;
end
end
end

if (p_k_x_cell +1 < (length_max+1)) && (p_k_y_cell -1>0)                                       %判断c点
if isempty(P_coor{p_k_x_cell+1,p_k_y_cell-1})
C = true;
else
if dist_count(P_coor{p_k_x_cell+1,p_k_y_cell-1},p_k)>r
C = true;
end
end
end

if (p_k_x_cell +1 < (length_max+1)) && (p_k_y_cell >0)                                          %判断D点
if isempty(P_coor{p_k_x_cell+1,p_k_y_cell})
D = true;
else
if dist_count(P_coor{p_k_x_cell+1,p_k_y_cell},p_k)>r
D = true;
end
end
end

if (p_k_x_cell +1 < (length_max+1)) && (p_k_y_cell +1<(width_max+1))                                          %判断E点
if isempty(P_coor{p_k_x_cell+1,p_k_y_cell+1})
E = true;
else
if dist_count(P_coor{p_k_x_cell+1,p_k_y_cell+1},p_k)>r
E = true;
end
end
end

if (p_k_x_cell  < (length_max+1)) && (p_k_y_cell +1<(width_max+1))                                          %判断F点
if isempty(P_coor{p_k_x_cell,p_k_y_cell+1})
F = true;
else
if dist_count(P_coor{p_k_x_cell,p_k_y_cell+1},p_k)>r
F = true;
end
end
end

if (p_k_x_cell -1 >0) && (p_k_y_cell +1<(width_max+1))                                          %判断G点
if isempty(P_coor{p_k_x_cell-1,p_k_y_cell+1})
G = true;
else
if dist_count(P_coor{p_k_x_cell-1,p_k_y_cell+1},p_k)>r
G = true;
end
end
end

if (p_k_x_cell -1
a340
>0) && (p_k_y_cell <(width_max+1))                                          %判断H点
if isempty(P_coor{p_k_x_cell-1,p_k_y_cell})
H = true;
else
if dist_count(P_coor{p_k_x_cell-1,p_k_y_cell},p_k)>r
H = true;
end
end
end

if A && B && C && D && E && F && G && H
Sam_num = Sam_num+1; %样本个数加1
active_flag = true ;  %样本不用从active_xy中剔除
Sam_xy = [Sam_xy p_k];
active_xy = [active_xy p_k];
P_coor{p_k_x_cell,p_k_y_cell} = p_k;
end

end
if active_flag == false
active_xy(:,rand_column) = [];  %删除不活性的粒子
end

end

%%%%画图
figure(1)
plot(Sam_xy(1,:),Sam_xy(2,:) , 'b.','markersize',10); %画出重采样后粒子的位置
%     hold on
%     plot(p_c(1), p_c(2), 'r.', 'markersize',10); %所有粒子的中心位置
%%%%画图
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息