Gaussian ring in 2d
19 views (last 30 days)
Show older comments
Hello,
I want to generate a 2d image (in form of a matrix) of a ring which is smoothed towards the outer and inner border by a Gaussian distribution, i.e. something looking like this:
That is, pixels in the image corresponding to the middle radius of the ring should have highest values and outer pixels values that are decreasing towards the borders.
Thanks, Denis
2 Comments
Naresh Sharma
on 17 Sep 2018
Can anyone suggest me the appropriate algorithm to find the center and the diameter(inner and outer) of the ring profile images?
Naresh
Petr Bouchal
on 28 Dec 2022
Edited: Petr Bouchal
on 28 Dec 2022
You can fit with the theoretical ring function using the least-squares method to find the width and central radius and calculate the inner and outer radius afterward.
%% generating ring with gaussian profile
x = linspace(-1,1,200);
y = linspace(-1,1,200);
[X,Y] = meshgrid(x,y);
[Phi,R] = cart2pol(X,Y);
R0 = 0.5; %ring radius
W = 0.2; %ring width
ring = exp(-((R-R0).^2)./W.^2);
%% finding center and diameter
fun = @(x,R) exp(-((R-x(1)).^2)./x(2).^2);
x0 = [1,1];
x = lsqcurvefit(fun,x0,R,ring);
R0_reconstructed = x(1);
W_reconstructed = x(2);
%% accuracy
R0_reconstructed
R0-R0_reconstructed
W_reconstructed
W-W_reconstructed
Accepted Answer
Seth Meiselman
on 15 Dec 2016
Try something like this: create a series of circles whose amplitude is in the form of a Gaussian with respect to some defined peak radius, R0, and the usual width factor, sig.
sizex = 1024;
sizey = 1024;
[ncols, nrows] = meshgrid(1:sizex, 1:sizey);
centerx = sizex/2;
centery = sizey/2;
R0 = 300;
sig = 20;
gring = zeros(sizex,sizey)';
for i=1:400
iR = i;
oR = i+sig;
array2D = (nrows - cy).^2 + (ncols - cx).^2;
ringPixels = array2D >= iR^2 & array2D <= oR^2;
gaussring = gaussring + ringPixels.*(1/(sig*sqrt(2*pi)))*exp(-((iR-R0)/(2*sig))^2);
end
figure(1);
surf(gaussring); axis tight; shading flat; view(2); colormap('jet');
This results in the plot:
and a non-trivial slice through the image
figure(2);
plot(gring(sizex/4,:)); axis tight;
2 Comments
Seth Meiselman
on 15 Dec 2016
I should have also said, since this is made on a discrete grid- it creates the matrix you are looking for, but also has some drawbacks- it's very 'pixelated'. You can see this by rotating the surface plot and observing spikes that pop up. Nothing a quick smoothing function wouldn't remove if it was critical to remove.
More Answers (3)
Petr Bouchal
on 23 Dec 2022
Edited: Petr Bouchal
on 28 Dec 2022
Hi, I would say the most appropriate approach is the following:
x = linspace(-1,1,200);
y = linspace(-1,1,200);
[X,Y] = meshgrid(x,y);
[Phi,R] = cart2pol(X,Y);
R0 = 0.5; %ring radius
W = 0.2; %ring width
ring = exp(-((R-R0).^2)./W.^2);
figure(); hold on;
imagesc(ring); axis equal; colormap gray;
plot(size(ring,1)*ring(0.5*size(ring,1),:));
0 Comments
KSSV
on 4 Oct 2016
clc; clear all ;
M = 10 ;
N = 100 ;
R1 = 0.5 ; % inner radius
R2 = 1 ; % outer radius
nR = linspace(R1,R2,M) ;
nT = linspace(0,2*pi,N) ;
%nT = pi/180*(0:NT:theta) ;
[R, T] = meshgrid(nR,nT) ;
% Convert grid to cartesian coordintes
X = R.*cos(T);
Y = R.*sin(T);
[m,n]=size(X);
%
D = (X.^2+Y.^2) ;
% D(D<R1) = 1 ;
% D(D>R2) = 1 ;
Z = gauss(D);
surf(X,Y,Z);
colormap('gray')
shading interp ;
view([0 90]) ;
set(gca,'color','k')
See Also
Categories
Find more on Descriptive Statistics in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!