Алгоритми обробки сигналів, визначені в безперервному часі / просторі / частоті, зазвичай реалізуються шляхом вибірки сигналу на дискретній сітці та перетворення інтегралів в суми (а похідні в різниці). Просторові фільтри реалізуються за допомогою згортки з ядром згортання (тобто зваженою сумою сусідів).
Існує величезна кількість знань щодо фільтрації вибіркових сигналів часової області; фільтри часової області реалізуються як фільтри кінцевих імпульсних характеристик , де поточна вибірка обчислюється як зважена сума попередніх N вхідних вибірок; або нескінченних імпульсних фільтрів, де поточний вихід є зваженою сумою попередніх входів та попередніх виходів . Формально фільтри дискретного часу описуються за допомогою перетворення z , яке є аналогом дискретного часу перетворенню Лапласа . Білінійної перетворення відображає один до інших ( c2d
і d2c
в Matlab).
Як би ви оцінили функції у довільних точках?
Коли вам потрібно значення сигналу в точці, яка не лежить безпосередньо на вашій сітці вибірки, ви інтерполюєте його значення з сусідніх точок. Інтерполяція може бути такою ж простою, як вибір найближчого зразка, обчислення середньозваженого значення серед найближчих вибірок або встановлення довільно складної аналітичної функції до вибіркових даних та оцінка цієї функції за необхідними координатами. Інтерполяція на рівномірну більш тонку сітку є надмірною . Якщо ваш оригінальний (безперервний) сигнал не містить деталей (тобто частот), менших за половину вибіркової сітки, то безперервну функцію можна ідеально реконструювати з вибіркової версії ( теорема дискретизації Найкіста-Шеннона ). Приклад того, як можна інтерполювати в 2D, дивбілінеарна інтерполяція .
У Matlab ви можете використовувати interp1
абоinterp2
інтерполювати 1D або регулярно відбирати 2D дані (відповідно), або griddata
інтерполювати з невірно відібраних 2D даних.
Чи буде у вас цикл for-циклу, який проходить через кожен воксель і обчислює відповідну формулу?
Так, саме.
Matlab позбавляє вас від необхідності робити це за допомогою явних for-циклів, оскільки він призначений для роботи на матрицях та векторах (тобто багатовимірних масивах). У Matlab це називається "векторизація". Певні інтеграли можуть бути апроксимувати sum
, cumsum
, trapz
, cumtrapz
і т.д.
Я прочитав книгу "Цифрова обробка зображень" Гонсалеса та Вудса, але все ще втрачаю. Я також читав про серії книг «Числові рецепти». Це був би правильний шлях?
Так, числові рецепти були б чудовим початком. Це дуже практично і охоплює більшість числових методів, які вам знадобляться. (Ви побачите, що Matlab вже реалізує все необхідне, окрім числових рецептів забезпечать відмінний фон.)
Я взяв клас "алгоритми та структури даних", але не бачу зв'язку між представленим там матеріалом та впровадженням наукових алгоритмів.
Матеріал, оброблений у курсах "Алгоритми та структури даних", має тенденцію концентруватися на структурах, таких як списки, масиви, дерева та графіки, що містять цілі числа чи рядки та такі операції, як сортування та вибір: проблеми, для яких зазвичай є єдиний правильний результат. Що стосується наукових алгоритмів, то це лише половина історії. Інша половина стосується методів оцінки реальних чисел та аналітичних функцій. Ви знайдете це в курсі на тему "Числові методи" (або "Числовий аналіз"; наприклад цей- прокручування вниз для слайдів): як оцінювати спеціальні функції, як оцінювати інтеграли та похідні і т. д. Тут одне з головних завдань - оцінити точність результату, а одна загальна закономірність - це повторити процедуру, яка покращує оцінити, поки вона не буде достатньо точною. (Ви можете запитати себе, як Matlab знає, як зробити щось настільки просто, як оцінити значення sin(x)
для деяких x
.)
Як простий приклад, ось короткий сценарій, який обчислює радонове перетворення зображення в Matlab. Перетворення радону приймає проекції зображення над набором проекційних кутів. Замість того, щоб намагатися обчислити проекцію під довільним кутом, я замість цього обертаю все зображення, використовуючи imrotate
так, щоб зйомка проекції завжди була вертикальною. Тоді ми можемо взяти проекцію просто, використовуючи sum
, оскількиsum
матриця повертає вектор , що містить суму по кожному стовпчику.
Ви можете написати своє, imrotate
якщо хочете, використовуючи 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]');
Те, що колись було інтегралом щільності вздовж променя, тепер є сумою над стовпчиком дискретно вибіреного зображення, яке, в свою чергу, було знайдено інтерполяцією вихідного зображення на трансформовану систему координат.