[Image Registration] Multi-modal non-rigid image registration algorithm with matlab code

?About the author: A Matlab simulation developer who loves scientific research. He cultivates his mind and improves his technology simultaneously. For cooperation on MATLAB projects, please send a private message.

Personal homepage: Matlab Research Studio

Personal credo: Investigate things to gain knowledge.

For more complete Matlab code and simulation customization content, click

Intelligent optimization algorithm Neural network prediction Radar communication Wireless sensor Power system

Signal processing Image processing Path planning Cellular automaton Drone

Content introduction

Image registration is an important problem in the field of computer vision, which involves aligning multiple images in the same coordinate system. In many applications, we need to register images from different sensors or at different points in time for comparison, analysis, or fusion. The multi-modal non-rigid image registration method is a special image registration problem. It needs to solve the registration problem between different modalities (such as magnetic resonance imaging and computed tomography), and also takes into account the Non-rigid deformation.

In this article, we will introduce a commonly used multi-modal non-rigid image registration algorithm and elaborate on its steps and principles.

The first step is feature extraction. In image registration, we need to find some representative feature points for matching. For multi-modal image registration, we can use some specific feature extraction methods, such as local feature descriptors (such as SIFT, SURF) or deep learning-based methods (such as CNN). These methods can extract robust feature points from images for subsequent matching.

The second step is feature matching. In this step, we need to match feature points from different images. This can be achieved by calculating the distance or similarity between feature points. A common method is to use a nearest neighbor algorithm (such as the K nearest neighbor algorithm) to find the most similar pair of feature points in two images. The result of matching will be a set of corresponding feature point pairs.

The third step is the selection of transformation model. In multi-modal non-rigid image registration, we need to take into account the non-rigid deformation in the image, so we need to choose an appropriate transformation model to describe the transformation relationship between images. Commonly used transformation models include affine transformation, elastic deformation model and nonlinear deformation model. Choosing an appropriate transformation model can better adapt to the deformation between images.

The fourth step is optimization. In this step, we need to estimate the parameters of the transformation model through an optimization algorithm to minimize the error between matched feature point pairs. Commonly used optimization algorithms include the least squares method, gradient descent method and Levenberg-Marquardt algorithm. Through iterative optimization algorithm, we can obtain the optimal transformation model parameters.

The fifth step is image interpolation and resampling. After the registration is completed, we need to interpolate and resample the images to obtain the final registration result. The interpolation algorithm can find the corresponding pixel value in the original image based on the pixel coordinates of the registration result, and perform interpolation calculations. Resampling algorithms can resize the registered image to a specific size and resolution.

Finally, we need to evaluate the quality of the registration. In multi-modal non-rigid image registration, we can use some evaluation indicators to evaluate the quality of the registration results, such as mean square error (MSE), mutual information (MI), and structural similarity index (SSIM). These metrics can help us understand the differences and similarities between the registration results and the original images.

In summary, multimodal non-rigid image registration is a complex and important problem that plays a key role in many medical image processing and computer vision applications. Through the steps of feature extraction, feature matching, transformation model selection, optimization, image interpolation and resampling, and quality assessment, we can achieve accurate and robust multi-modal non-rigid image registration. This will provide us with more image information and help us conduct more in-depth analysis and research.

Part of the code

function [Ireg,Bx,By,Fx,Fy] = register_images(Imoving,Istatic,Options)</code><code>% This function register_images is the most easy way to register two</code><code> % images both affine and nonrigidly.</code><code>%</code><code>% Features:</code><code>% - It can be used with images from different type of scans or modalities.</code><code>% code><code>% - It uses both a rigid transform and a nonrigid registration.</code><code>% - It uses multilevel refinement</code><code>% - It can be used with images of different sizes. </code><code>% - The function will automatically detect single modality or multiple</code><code>% modalities, and choose the right registration method.</code><code>%</code><code> % [Ireg,Bx,By,Fx,Fy] = register_images(Imoving,Istatic,Options);</code><code>%</code><code>% Inputs,</code><code>% Imoving: The image which will be registered</code><code>% Istatic : The image on which Imoving will be registered</code><code>% Options : Registration options, see help below</code><code>%</code> code><code>% Outputs,</code><code>% Ireg : The registered moving image</code><code>% Bx, By : The backwards transformation fields of the pixels in </code><code>% x and y direction seen from the static image to the moving image.</code><code>% Fx, Fy : The (approximated) forward transformation fields of the pixels in </code><code>% x and y direction seen from the moving image to the static image.</code><code>% (See the function backwards2forwards)</code><code>% Options,</code><code>% Options.SigmaFluid : The sigma of the gaussian smoothing kernel of the pixel</code><code>% velocity field / update field, this is a form of fluid</code><code>% regularization, (default 4)</code><code>% Options.SigmaDiff : The sigma for smoothing the transformation field</code><code>% is not part of the original demon registration, this is </code><code>% a form of diffusion regularization, (default 1)</code><code>% Options.Interpolation : Linear (default) or Cubic.</code><code>% Options.Alpha : Constant which reduces the influence of edges (and noise)</code><code>% and limits the update speed (default 4). </code><code>% Options.Similarity : Choose 'p' for single modality and 'm' for </code><code>% images of different modalities. (default autodetect) </code><code>% Options.Registration: Rigid, Affine, NonRigid </code><code>% Options.MaxRef: Maximum number of grid refinements steps.</code><code>% Options.Verbose: Display Debug information 0,1 or 2 </code><code>% </code><code>% Notes,</code><code>% In case of Multiple Modalities affine registration is done with mutual</code><code> % information. The non-rigid registration is done by first doing a</code><code>% modality transformation (paints regions in image 1 with the intensity</code><code>% pallette of those regions in image2 and visa versa ), and than </code><code>% using "normal" pixel based demon registration. See MutualTransform.m</code><code>% </code><code>%</code><code> % Example,</code><code>% % Read two grayscale images of Lena</code><code>% Imoving=imread('images/lenag1.png'); </code><code>% Istatic =imread('images/lenag3.png');</code><code>% </code><code>% % Register the images</code><code>% [Ireg,Bx,By,Fx ,Fy] = register_images(Imoving,Istatic,struct('Similarity','p'));</code><code>%</code><code>% % Show the registration result</code><code>% figure,</code><code>% subplot(2,2,1), imshow(Imoving); title('moving image');</code><code>% subplot(2 ,2,2), imshow(Istatic); title('static image');</code><code>% subplot(2,2,3), imshow(Ireg); title('registerd moving image ');</code><code>% % Show also the static image transformed to the moving image</code><code>% Ireg2=movepixels(Istatic,Fx,Fy);</code><code>% subplot(2,2,4), imshow(Ireg2); title('registerd static image');</code><code>%</code><code>% % Show the transformation fields</code> <code>% figure,</code><code>% subplot(2,2,1), imshow(Bx,[]); title('Backward Transf. in x direction');</code><code>% subplot(2,2,2), imshow(Fx,[]); title('Forward Transf. in x direction');</code><code>% subplot(2,2,3) , imshow(By,[]); title('Backward Transf. in y direction');</code><code>% subplot(2,2,4), imshow(Fy,[]); title( 'Forward Transf. in y direction');</code><code>%</code><code>% % Calculate strain tensors</code><code>% E = strain(Fx,Fy);</code><code>% % Show the strain tensors</code><code>% figure,</code><code>% subplot(2,2,1), imshow(E(:,:,1,1 ),[]); title('Strain Tensors Exx');</code><code>% subplot(2,2,2), imshow(E(:,:,1,2),[]) ; title('Strain Tensors Exy');</code><code>% subplot(2,2,3), imshow(E(:,:,2,1),[]); title(' Strain Tensors Eyx');</code><code>% subplot(2,2,4), imshow(E(:,:,2,2),[]); title('Strain Tensors Eyy' );</code><code>%</code><code>% Example Multi-Modalities</code><code>% % Read two brain images </code><code>% Imoving=im2double(imread(\ 'images/brain_T1_wave.png')); </code><code>% Istatic=im2double(imread('images/brain_T2.png'));</code><code>%</code><code>% % Register the images</code><code>% [Ireg,Bx,By] = register_images(Imoving,Istatic,struct('SigmaFluid',4));</code><code>%</code><code>% figure,</code><code>% subplot(1,3,1), imshow(Imoving); title('moving image');</code><code>% subplot (1,3,2), imshow(Istatic); title('static image');</code><code>% subplot(1,3,3), imshow(Ireg); title('registerd moving image');</code><code>%</code><code>% % Read normal T1 image and transformation field</code><code>% Inormal=im2double(imread('images/brain_T1. png'));</code><code>% load('images/wave_field.mat');</code><code>%</code><code>% % Show the difference with ideal image </code><code>% figure, imshow(Imoving-Inormal,[-0.5 0.5]); title('unregistered')</code><code>% figure, imshow(Ireg-Inormal,[-0.5 0.5]); title('registered');</code><code>% disp(['pixel abs difference : ' num2str(sum(abs(Imoving(:)-Inormal(:)))) ])</code><code>% disp(['pixel abs difference : ' num2str(sum(abs(Imoving(:)-Ireg(:))))])</code><code>%</code><code>% % Show Warp field</code><code>% figure,</code><code>% subplot(2,2,1), imshow(BxNormal,[-20 20]); title ('Bx Normal');</code><code>% subplot(2,2,2), imshow(Bx,[-20 20]); title('Bx');</code> <code>% subplot(2,2,3), imshow(ByNormal,[-20 20]); title('By Normal');</code><code>% subplot(2,2,4) , imshow(By,[-20 20]); title('By');</code><code>?</code><code>?</code><code>% Function is written by D .Kroon University of Twente (March 2009)</code><code>?</code><code>?</code><code>% add all needed function paths</code><code>try</code> <code> functionname='register_images.m';</code><code> functiondir=which(functionname);</code><code> functiondir=functiondir(1:end-length(functionname));</code> code><code> addpath([functiondir '/functions'])</code><code> addpath([functiondir '/functions_affine'])</code><code> addpath([functiondir '/ functions_nonrigid'])</code><code>catch me</code><code> disp(me.message);</code><code>end</code><code>?</code><code>% Disable warning</code><code>warning('off', 'MATLAB:maxNumCompThreads:Deprecated')</code><code>?</code><code>% Process inputs</code><code>defaultoptions=struct('Similarity',[],'Registration','NonRigid','MaxRef',[],'Verbose',2,'SigmaFluid\ ',4,'Alpha',4,'SigmaDiff',1,'Interpolation','Linear');</code><code>if(~exist('Options' ,'var')), </code><code> Options=defaultoptions; </code><code>else</code><code> tags = fieldnames(defaultoptions);</code><code> for i=1:length(tags)</code><code> if(~isfield(Options,tags{i})), Options.(tags{i})=defaultoptions.(tags{i}); end</code><code> end</code><code> if(length(tags)~=length(fieldnames(Options))), </code><code> warning('register_images:unknownoption','unknown options found');</code><code> end</code><code>end</code><code>?</code><code>% Set parameters</code><code>MaxRef=Options .MaxRef;</code><code>?</code><code>% Start time measurement</code><code>if(Options.Verbose>0), tic; end</code><code>?</code><code>% Store the class of the inputs</code><code>Iclass=class(Imoving);</code><code>?</code><code>% Convert the inputs to double</code> code><code>Imoving=im2double(Imoving);</code><code>Istatic=im2double(Istatic);</code><code>?</code><code>% Resize the moving image to fit the static image</code><code>if(sum(size(Istatic)-size(Imoving))~=0)</code><code> Imoving = imresize(Imoving,size(Istatic),'bicubic') ;</code><code>end</code><code>?</code><code>% Make smooth images for histogram and fast affine registration</code><code>ISmoving=imgaussian(Imoving,2.5,[ 10 10]);</code><code>ISstatic=imgaussian(Istatic,2.5,[10 10]);</code><code>?</code><code>% Detect if the mutual information or pixel distance can be used as </code><code>% similarity measure. By comparing the histograms.</code><code>if(isempty(Options.Similarity))</code><code> Hmoving= hist(ISmoving(: ),60)./numel(Imoving);</code><code> Hstatic = hist(ISstatic(:),60)./numel(Istatic);</code><code> Hmoving(1)=0; Hstatic(1)=0;</code><code> if(sum(log(abs(Hmoving-Hstatic) + 1))>0.3), </code><code> Options.Similarity='m' ; </code><code> if(Options.Verbose>0), disp('Multi Modalities, Mutual information is used'); drawnow; end</code><code> else</code><code> Options.Similarity='p';</code><code> if(Options.Verbose>0), disp('Same Modalities, Pixel Distance is used'); drawnow; end</code><code> end</code><code>end</code><code>if(Options.Similarity(1)=='p'), type_affine='sd'; else type_affine='mi' ; end</code><code>% Register the moving image affine to the static image</code><code>?</code><code>% Affine register the smoothed images to get the registration parameters</code><code>if(strcmpi(Options.Registration(1),'R'))</code><code> if(Options.Verbose>0), disp('Start Rigid registration'); drawnow; end </code><code> % Parameter scaling of the Translation and Rotation</code><code> scale=[1 1 1];</code><code> % Set initial affine parameters</code><code> x =[0 0 0];</code><code>elseif(strcmpi(Options.Registration(1),'A'))</code><code> if(Options.Verbose>0), disp( 'Start Affine registration'); drawnow; end</code><code> % Parameter scaling of the Translation, Rotation, Resize and Shear</code><code> scale=[1 1 1 0.01 0.01 1e-4 1e -4];</code><code> % Set initial affine parameters</code><code> x=[0 0 0 100 100 0 0];</code><code>elseif(strcmpi(Options.Registration( 1),'N'))</code><code> if(Options.Verbose>0), disp('Start Affine part of Non-Rigid registration'); drawnow; end</code><code> % Parameter scaling of the Translation, Rotation, Resize and Shear</code><code> scale=[1 1 1 0.01 0.01 1e-4 1e-4];</code><code> % Set initial affine parameters</code><code> x=[0 0 0 100 100 0 0];</code><code>else</code><code> warning('register_images:unknownoption','unknown registration method' ); </code><code>end</code><code>?</code><code>for refine_itt=1:2</code><code> if(refine_itt==2)</code><code> ISmoving=Imoving; ISstatic=Istatic;</code><code> end</code><code> % Use struct because expanded optimset is part of the Optimization Toolbox.</code><code> optim=struct(\ 'GradObj','off','GoalsExactAchieve',1,'Display','off','MaxIter',100,'MaxFunEvals',1000,'TolFun ',1e-14,'DiffMinChange',1e-6);</code><code> if(Options.Verbose>0), optim.Display='iter'; end</code><code> x=fminlbfgs(@(x)affine_registration_error(x,scale,ISmoving,ISstatic,type_affine),x,optim); </code><code>end</code><code>?</code><code>% Scale the translation, resize and rotation parameters to the real values</code><code>x=x.*scale;</code><code>?</code><code>if(strcmpi(Options.Registration (1),'R'))</code><code> % Make the rigid transformation matrix</code><code> M=make_transformation_matrix(x(1:2),x(3));</code> code><code>else</code><code> % Make the affine transformation matrix</code><code> M=make_transformation_matrix(x(1:2),x(3),x(4:5)); </code><code>end</code><code>?</code><code>?</code><code>% Make center of the image transformation coordinates 0,0</code><code>[ x,y]=ndgrid(0:(size(Imoving,1)-1),0:(size(Imoving,2)-1));</code><code>xd=x-(size(Imoving, 1)/2); yd=y-(size(Imoving,2)/2);</code><code>?</code><code>% Calculate the backwards transformation fields</code><code>Bx = ((size(Imoving,1)/2) + M(1,1) * xd + M(1,2) *yd + M(1,3) * 1)-x;</code><code> By = ((size(Imoving,2)/2) + M(2,1) * xd + M(2,2) *yd + M(2,3) * 1)-y;</code><code>?</code><code>% Initialize the modality transformed image variables</code><code>M_TF=[]; F_TF=[];</code><code> </code><code>% The nonrigid part of the registration</code><code>if(strcmpi(Options.Registration(1),'N'))</code><code> </code><code> % Demon registration parameters</code><code> refinements=floor(log2(min(size(Imoving))/16));</code><code> if(refinements>MaxRef), refinements=MaxRef; end</code><code> parameters. sigma_diff=Options.SigmaDiff;</code><code> </code><code> % Non-rigid registration</code><code> if(Options.Verbose>0), disp('Start non-rigid demon registration'); drawnow; end</code><code>?</code><code> % Do every refinements step twice if modality transformation enabled</code><code> if(Options.Similarity(1)== 'm'), loop=2; else loop=1; end</code><code> </code><code> % Loop trough all refinements steps.</code><code> for j=0: refinements</code><code> for l=1:loop</code><code> % Set scaling parameters.resizepercentageentage</code><code> resizepercentage=1/2^(refinements-j);</code> <code> if(resizepercentage>1), resizepercentage=1; end</code><code>?</code><code> parameters.alpha=Options.Alpha*sqrt(resizepercentage);</code><code> parameters.sigma_fluid=Options.SigmaFluid;</code><code>?</code><code> if(Options.Verbose>0), disp(['Scaling resizepercentageentage : ' num2str(resizepercentage)]), end </code><code>?</code><code> % Incase of multiple modalities, transform both images to their</code><code> % opposite modalities.</code><code> if(Options.Similarity( 1)=='m')</code><code> if(Options.Verbose>0), disp('Start modality transformation'); drawnow; end</code><code> Bx_large=imresize (Bx,size(Imoving),'bicubic')*(size(Imoving,1)/size(Bx,1));</code><code> By_large=imresize(By,size(Imoving),\ 'bicubic')*(size(Imoving,2)/size(By,2));</code><code> [Imoving_TF,Istatic_TF]=MutualTransform(Imoving,Istatic,15*sqrt(1/resizepercentage), 4,Bx_large,By_large);</code><code> if(Options.Verbose>0), disp('Finished modality transformation'); drawnow; end</code><code> end</code><code>?</code><code> sigma = 0.3/resizepercentage;</code><code> % Set and resize the moving image and static image</code><code> M=imresize(imgaussian(Imoving,sigma, [sigma*6 sigma*6]),resizepercentage,'bicubic'); </code><code> F=imresize(imgaussian(Istatic,sigma,[sigma*6 sigma*6]),resizepercentage,' bicubic');</code><code> </code><code> % Resize the modality transformed images</code><code> if(Options.Similarity(1)=='m')</code><code> M_TF=imresize(imgaussian(Imoving_TF,sigma,[sigma*6 sigma*6]),resizepercentage,'bicubic'); </code><code> F_TF=imresize(imgaussian(Istatic_TF,sigma ,[sigma*6 sigma*6]),resizepercentage,'bicubic');</code><code> end</code><code>?</code><code> % Resize the transformation field to current image size</code><code> Bx=imresize(Bx,size(M),'bicubic')*(size(M,1)/size(Bx,1));</code><code> By=imresize(By,size(M),'bicubic')*(size(M,2)/size(By,2));</code><code>?</code><code> % Put transformation fields in x and y direction in one variable</code><code> B=zeros([size(M) 2]); B(:,:,1)=Bx; B(:,:,2) =By;</code><code> % Store the dimensions of transformation field, and make a long vector from T</code><code> sizes=size(B); B=B(:);</code> <code>?</code><code> % Parameters</code><code> options.sigma_fluid=parameters.sigma_fluid;</code><code> options.sigma_diff=parameters.sigma_diff;</code><code> options.alpha=parameters.alpha;</code><code> options.interpolation=Options.Interpolation;</code><code> </code><code> % Optimizer parameters</code><code> optim=struct ('Display','off','StoreN',10,'GoalsExactAchieve',0,'HessUpdate','lbfgs','GradObj','on ','OutputFcn', @store_transf,'MaxIter',200,'TolFun',1e-14,'DiffMinChange',1e-5);</code><code> if( l==loop), </code><code> optim.TolX = 0.02; </code><code> else</code><code> optim.TolX = 0.1; </code><code> end</code> code><code> if(Options.Verbose>1), optim.Display='iter'; end</code><code>?</code><code> % Start the demon energy registration optimizer</code><code> B=fminlbfgs(@(x)demons_energy(M,F,M_TF,F_TF,x,sizes,options),B,optim);</code><code>?</code><code> % Reshape B from a vector to an x and y transformation field</code><code> B=reshape(B,sizes);</code><code> Bx=B(:,:,1); By=B( :,:,2);</code><code> end</code><code> end</code><code>?</code><code> % Scale everything back if not already</code><code> if(resizepercentage~=1)</code><code> Bx=imresize(Bx,size(Imoving),'bicubic')*(size(Imoving,1)/size(Bx,1)); </code><code> By=imresize(By,size(Imoving),'bicubic')*(size(Imoving,2)/size(By,2));</code><code> end</code><code>end</code><code> </code><code>% Transform the input image</code><code>Ireg=movepixels(Imoving,Bx,By,[], 3);</code><code>?</code><code>if ( nargout>3 )</code><code> % Make the forward transformation fields from the backwards</code><code> [Fx,Fy]=backwards2forwards (Bx,By);</code><code>end</code><code>?</code><code>% Set the class of output to input class</code><code>if(strcmpi(Iclass ,'uint8')), Ireg=im2uint8(Ireg); end</code><code>if(strcmpi(Iclass,'uint16')), Ireg=im2uint16(Ireg); end</code> <code>if(strcmpi(Iclass,'uint32')), Ireg=im2uint32(Ireg); end</code><code>if(strcmpi(Iclass,'int8')), Ireg=im2int8( Ireg); end</code><code>if(strcmpi(Iclass,'int16')), Ireg=im2int16(Ireg); end</code><code>if(strcmpi(Iclass,'int32\ ')), Ireg=im2int32(Ireg); end</code><code>if(strcmpi(Iclass,'single')), Ireg=im2single(Ireg); end</code><code>?</code><code>% End time measurement</code><code>if(Options.Verbose>0), toc, end</code><code>?</code><code>?

Operation results

References

[1] Shi Yuexiang, Chen Cai. Non-rigid registration segmentation algorithm based on optimal Atlas multi-modal images [J]. Acta Optica Sinica, 2019, 39(4):11.DOI:10.3788/AOS201939.0410002.

[2] Su Mengchao. Research on multi-modal medical image registration technology based on SURF and optical flow field [D]. Nanchang Hangkong University, 2019.

[3] Wang Lifang, Wang Yanli, Shi Chaoyu, et al. Non-rigid multi-modal medical image registration method based on ZMLD and GC discrete optimization: CN201810563047.7[P].CN108711168A[2023-10-26].

Some theories are quoted from online literature. If there is any infringement, please contact the blogger to delete it
Follow me to receive massive matlab e-books and mathematical modeling materials

Private message complete code, paper reproduction, journal cooperation, paper tutoring and scientific research simulation customization

1 Improvements and applications of various intelligent optimization algorithms
Production scheduling, economic scheduling, assembly line scheduling, charging optimization, workshop scheduling, departure optimization, reservoir scheduling, three-dimensional packing, logistics location selection, cargo space optimization, bus scheduling optimization, charging pile layout optimization, workshop layout optimization, Container ship stowage optimization, water pump combination optimization, medical resource allocation optimization, facility layout optimization, visible area base station and drone site selection optimization
2 Machine learning and deep learning
Convolutional neural network (CNN), LSTM, support vector machine (SVM), least squares support vector machine (LSSVM), extreme learning machine (ELM), kernel extreme learning machine (KELM), BP, RBF, width Learning, DBN, RF, RBF, DELM, XGBOOST, TCN realize wind power prediction, photovoltaic prediction, battery life prediction, radiation source identification, traffic flow prediction, load prediction, stock price prediction, PM2.5 concentration prediction, battery health status prediction, water body Optical parameter inversion, NLOS signal identification, accurate subway parking prediction, transformer fault diagnosis
2. Image processing
Image recognition, image segmentation, image detection, image hiding, image registration, image splicing, image fusion, image enhancement, image compressed sensing
3 Path planning
Traveling salesman problem (TSP), vehicle routing problem (VRP, MVRP, CVRP, VRPTW, etc.), UAV three-dimensional path planning, UAV collaboration, UAV formation, robot path planning, raster map path planning , multimodal transportation problems, vehicle collaborative UAV path planning, antenna linear array distribution optimization, workshop layout optimization
4 UAV applications
UAV path planning, UAV control, UAV formation, UAV collaboration, UAV task allocation, and online optimization of UAV safe communication trajectories
5 Wireless sensor positioning and layout
Sensor deployment optimization, communication protocol optimization, routing optimization, target positioning optimization, Dv-Hop positioning optimization, Leach protocol optimization, WSN coverage optimization, multicast optimization, RSSI positioning optimization
6 Signal processing
Signal recognition, signal encryption, signal denoising, signal enhancement, radar signal processing, signal watermark embedding and extraction, EMG signal, EEG signal, signal timing optimization
7 Power system aspects
Microgrid optimization, reactive power optimization, distribution network reconstruction, energy storage configuration
8 Cellular Automata
Traffic flow, crowd evacuation, virus spread, crystal growth
9 Radar aspect
Kalman filter tracking, track correlation, track fusion

The knowledge points of the article match the official knowledge files, and you can further learn related knowledge. Algorithm skill tree Home page Overview 57166 people are learning the system