⽤MATLAB绘制随机散斑图案【源码+正确的椭圆旋转公式】
⽬录
前⾔
由于本⼈近期正在展开数字图像相关技术⽤于测量材料形变⽅向的研究,其中需要对别⼈现有算法的复现和调研,尽管其中很多算法都已经⾮常成熟,但对于初学者⽽⾔即使明⽩其中的原理,⽆法上⼿实践和操作的话,依然⽆法能够将其完全的应⽤起来或者在上⾯进⾏创新,我希望能将⾃⼰作为⼀个初学者复现他⼈代码和学习该原理的过程记录下来,⽅便每⼀个涉⾜该领域的⼈能更快应⽤这些知识。
随机散斑图像的质量很⼤程度上决定了数字图像相关中匹配算法的收敛性,为⽅便⼤家做实验时候⽣成散斑图像,我这⾥分享了我⾃⼰写的绘制随机散斑图案的MATLAB源码,有关随机散斑对于数字图像相关算法的影响,建议阅读参考引⽤中的两篇⽂献,如果你对数字图像相关算法感兴趣,欢迎阅读我的其他帖⼦:
1.
2.
这份源码的算法部分借鉴了⼀部分Y Su⼤佬的开源软件Glare: A free and open-source software for generation and assessment of digital speckle pattern ,如果你需要在课题中使⽤他的软件请记得引⽤,以下是两个推荐使⽤的散斑图像⽣成软件(⽐我的源码更强⼤):
1.
2.
⼀.源代码
S
代码中我放⼊了⼀个随机种⼦⽣成,如果你需要复现之前跑出来的随机图像,可以提前将这个种⼦以及当时实验设置的参数保存下来,这样就可以复现当时的随机图像了。其他部分我都做了较为详细的注释,椭圆绕其中⼼点的旋转公式请参照Section 3⾥的内容。
clear
close all
clc
%% Section 1:散斑参数设置
width=1920;% 图像宽
height=1080;% 图像⾼
diameter=20;% 散斑直径(单位:像素)
density=0.5;% 密排度(区间:0-1,图像上的散斑密度)
variation=0.5;% 偏移度(区间:0-1,图像上的散斑随机排布程度,0时即为圆点整列)
background=1;% 图像背景颜⾊(0:⿊⾊,1:⽩⾊)
% 可选设置
eccentricity=0.99;% 椭圆的偏⼼率(区间:[0,1),为0时即为圆点)
S=rng;% ⽣成⼀组随机数种⼦,使之后Section中产⽣的散斑伪随机
%% Section 2:⽣成随机散斑在图像上的位置
radius=0.5*diameter;% 散斑半径(单位:像素)
major_radius = radius /sqrt(sqrt(1- eccentricity * eccentricity));% 长轴
minor_radius = radius *sqrt(sqrt(1- eccentricity * eccentricity));% 短轴
% 散斑个数
spacing = diameter / density;
rows=fix(height/spacing);
cols=fix(width/spacing);
% 散斑位置
x=zeros(rows +1, cols +1);
y=zeros(rows +1, cols +1);
% 散斑边界位置
xmin=0.5*(width - cols * spacing);
xmin=0.5*(width - cols * spacing);
ymin=0.5*(height - rows * spacing);
for r=1:rows+1
for c=1:cols+1
x(r,c)=xmin + c*spacing;
y(r,c)=ymin + r*spacing;
end
end
% 加载随机种⼦
rng(S);
% 增加随机移动量
limit =0.5* variation * spacing;
x=x+limit*2*(rand(rows+1,cols+1)-1);
y=y+limit*2*(rand(rows+1,cols+1)-1);
% 椭圆转动⾓
theta=(360*rand(rows +1, cols +1))/180*pi;
%% Section 3:绘制散斑图像
% 创建画布
if background==1
back=ones(height,width);
else
back=zeros(height,width);
end
figure('visible','off')% figure隐藏,避免⿏标放在画布上时出现⼯具栏imshow(back,'border','tight')% 限制figure的⼤⼩与图像⼤⼩⼀致
hold on, axis equal
% 绘制散斑
rot=0:0.1:2*pi;
for r=1:size(x,1)
for c=1:size(x,2)
alpha=[cos(theta(r,c))-sin(theta(r,c))
sin(theta(r,c))cos(theta(r,c))];
x_=major_radius*cos(rot);
y_=minor_radius*sin(rot);
% 椭圆旋转公式
XY=alpha*[x_; y_];
X=XY(1,:)'+x(r,c);
Y=XY(2,:)'+y(r,c);
% % 百度百科上的公式(有问题)
% X=x_*cos(theta(r,c))-y_*(minor_radius/major_radius)*sin(theta(r,c)); % Y=x_*(major_radius/minor_radius)*sin(theta(r,c))+y_*cos(theta(r,c));
if background==1
plot(X,Y,'k');
fill(X,Y,'k');
else
plot(X,Y,'w');
fill(X,Y,'w');
end
xlim([0 width]),ylim([0 height])
hold on,axis off
end
end
%% Section 4:保存散斑图⽚
im=frame2im(getframe(gcf));
figure
imshow(im)
matlab生成随机数
imwrite(im,'speckle.bmp');
⼆.效果图
三.写在最后本来是想⽩嫖别⼈现成的代码 ,结果发现⽹上很多源码要么是要收费(还不⼀定能⽤),要么就是算法谬误或者注释稀烂,尤其百度百科给出的椭圆旋转的公式,明明就是绕原点在旋转嘛,我在代码中也把他的公式写了,⼤家可以试⼀试!最后想想还是⾃⼰写好了,希望这份源码能帮助到有需要的读者,我MATLAB玩的不是太6,如果您觉得有更好的实现⽅法或者对我错误的纠正,请您务必对我进⾏指正,以确保代码的准确度。
参考引⽤
1. Su Y, Zhang Q. Glare: A free and open-source software for generation and assessment of digital speckle pattern[J].
Optics and Lasers in Engineering, 2022, 148: 106766.
2. Orteu J J, Garcia D, Robert L, et al. A speckle texture image generator[C]//Speckle06: speckles, from grains to flowers.
International Society for Optics and Photonics, 2006, 6341: 63410H.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论