Poission disk sampling
2015-11-25 20:22
239 查看
Poission disk sampling
标签(空格分隔):sunflower1.泊松盘采样的优点
具有蓝色噪声频谱特征。与单纯的随机采样方法相比,这种方法在保持随机性的同时,使采样点的分布更加均匀,可以弥补随机采样的不足。 蓝色噪声频谱:描述随机类型特征的一个统计模型,其特点是主要**频率周围分布的其他频率值都非常小**,所以真值或者主频率很容易被检测到。这种特征很类似于点扩散函数,可以降低互相干噪声。
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); %所有粒子的中心位置 %%%%画图
相关文章推荐
- Snort之Stream5ProcessTcp()
- 哪个支付接口好?如何选择支付接口
- 进程间通信----共享内存
- PHP - session编码和解码
- iOS之初识UI
- IOS获取当前时区时间,并截取年月日输出字符串
- 欢迎使用CSDN-markdown编辑器
- cf 599 B (stl)
- Prime RingProblem素环问题 14
- Java的对象问题
- Number of 1 BitsWrite a function that takes an unsigned integer and returns the number of ’1' bits i
- Alfred 2 使用指南
- python 短语查询(中文版本+英文版本)
- 排序---选择排序
- Uniform Generator统一发电机 13
- 在imac上面Android NDK环境变量的配置
- 第二次spring冲刺第2天
- 用纯css改变下拉列表select框的默认样式(不兼容IE10以下)
- Code(容斥,好题)
- Scrapy Item Loaders机制详解