Les algorithmes de traitement du signal définis en temps / espace / fréquence continus sont généralement mis en œuvre en échantillonnant le signal sur une grille discrète et en convertissant les intégrales en sommes (et les dérivés en différences). Les filtres spatiaux sont mis en œuvre par convolution avec un noyau de convolution (c'est-à-dire la somme pondérée des voisins).
Il existe un énorme corpus de connaissances concernant le filtrage des signaux du domaine temporel échantillonnés; les filtres dans le domaine temporel sont mis en œuvre sous forme de filtres à réponse impulsionnelle finie , où l'échantillon de sortie actuel est calculé comme une somme pondérée des N échantillons d'entrée précédents; ou filtres à réponse impulsionnelle infinie, où la sortie de courant est une somme pondérée des entrées et sorties précédentes . Formellement, les filtres temporels discrets sont décrits en utilisant la transformée z , qui est l'analogue temporel discret de la transformée de Laplace . La transformation bilinéaire est mappée l'une à l'autre ( c2d
et d2c
dans Matlab).
Comment évalueriez-vous les fonctions à des points arbitraires?
Lorsque vous avez besoin de la valeur d'un signal à un point qui ne se trouve pas directement sur votre grille d'échantillonnage, vous interpolez sa valeur à partir de points voisins. L'interpolation peut être aussi simple que de choisir l'échantillon le plus proche, de calculer une moyenne pondérée des échantillons les plus proches, ou d'adapter une fonction analytique arbitrairement compliquée aux données échantillonnées et d'évaluer cette fonction aux coordonnées nécessaires. L'interpolation sur une grille uniforme plus fine est un suréchantillonnage . Si votre signal d'origine (continu) ne contient pas de détails (c'est-à-dire des fréquences) plus fins que la moitié de la grille d'échantillonnage, alors la fonction continue peut être parfaitement reconstruite à partir de la version échantillonnée (le théorème d'échantillonnage de Nyquist-Shannon ). Pour voir un exemple d'interpolation en 2D, consultezinterpolation bilinéaire .
Dans Matlab, vous pouvez utiliser interp1
ou interp2
pour interpoler 1D ou des données 2D échantillonnées régulièrement (respectivement), ou griddata
pour interpoler à partir de données 2D échantillonnées irrégulièrement.
Auriez-vous une boucle for passant par chaque voxel et calculant la formule correspondante?
Oui, exactement.
Matlab vous évite d'avoir à le faire via des boucles for explicites car il est conçu pour fonctionner sur des matrices et des vecteurs (c'est-à-dire des tableaux multidimensionnels). Dans Matlab, cela s'appelle la "vectorisation". Intégrales peuvent être approchées Definite avec sum
, cumsum
, trapz
, cumtrapz
, etc.
J'ai lu le livre "Digital Image Processing" de Gonzalez et Woods mais je suis toujours perdu. J'ai également lu des articles sur la série de livres sur les recettes numériques. Serait-ce la bonne façon?
Oui, les recettes numériques seraient un bon début. Il est très pratique et couvre la plupart des méthodes numériques dont vous aurez besoin. (Vous constaterez que Matlab implémente déjà tout ce dont vous avez besoin, mais les recettes numériques fourniront un excellent arrière-plan.)
J'ai pris un cours "algorithmes et structures de données", mais je ne vois pas la relation entre le matériel qui y est présenté et la mise en œuvre d'algorithmes scientifiques.
Le matériel traité dans les cours "Algorithmes et structures de données" a tendance à se concentrer sur des structures telles que des listes, des tableaux, des arbres et des graphiques contenant des nombres entiers ou des chaînes et des opérations comme le tri et la sélection: problèmes pour lesquels il n'y a généralement qu'un seul résultat correct. En ce qui concerne les algorithmes scientifiques, ce n'est que la moitié de l'histoire. L'autre moitié concerne les méthodes d'estimation des nombres réels et des fonctions analytiques. Vous le trouverez dans un cours sur les "Méthodes numériques" (ou "Analyse numérique"; comme celui-ci- faites défiler vers le bas pour les diapositives): comment estimer des fonctions spéciales, comment estimer des intégrales et des dérivées, etc. estimer jusqu'à ce qu'il soit suffisamment précis. (Vous pourriez vous demander comment Matlab sait comment faire quelque chose d'aussi simple que d'estimer une valeur de sin(x)
pour certains x
.)
À titre d'exemple simple, voici un petit script qui calcule une transformation radon d'une image dans Matlab. La transformation du radon prend des projections d'une image sur un ensemble d'angles de projection. Au lieu d'essayer de calculer la projection selon un angle arbitraire, je fais plutôt pivoter l'image entière à l'aide de imrotate
sorte que la prise de projection soit toujours verticale. Ensuite, nous pouvons prendre la projection simplement en utilisant sum
, car la sum
matrice renvoie un vecteur contenant la somme sur chaque colonne.
Vous pouvez écrire le vôtre imrotate
si vous préférez, en utilisant interp2
.
%%# Home-made Radon Tranform
%# load a density map (image).
A = phantom;
n_pixels = size(A, 1); %# image width (assume square)
%# At what rotation angles do we want to take projections?
n_thetas = 101;
thetas = linspace(0, 180, n_thetas);
result = zeros(n_thetas, n_pixels);
%# Loop over angles
for ii=1:length(thetas)
theta = thetas(ii);
rotated_image = imrotate(A, theta, 'crop');
result(ii, :) = sum(rotated_image);
end
%# display the result
imagesc(thetas, 1:n_pixels, result.');
xlabel('projection angle [degrees]');
Ce qui était autrefois une intégrale de la densité le long d'un rayon est maintenant une somme sur une colonne d'une image échantillonnée discrètement, qui a été trouvée à son tour en interpolant l'image originale sur un système de coordonnées transformé.