Реалізація алгоритмів технічного паперу в C ++ або MATLAB


14

Я підрозділ електротехніки. Я читав багато технічних праць про алгоритми обробки сигналів та зображень (реконструкція, сегментація, фільтрація тощо). Більшість алгоритмів, показаних у цих роботах, визначені протягом безперервного часу та безперервної частоти і часто дають рішення в умовах складних рівнянь. Як би ви реалізували технічний документ з нуля в C ++ або MATLAB, щоб повторити результати, отримані у зазначеному документі?

Більш конкретно, я дивився на статтю "Загальний алгоритм відновлення конусного променя" Ван та ін. ( IEEE Trans Med Imaging. 1993; 12 (3): 486-96 ), і мені було цікаво, як мені взагалі почати реалізуючи їх алгоритм? Рівняння 10 дає формулу реконструйованого зображення в. Як би ви це зашифрували? Чи буде у вас цикл for-циклу, який проходить через кожен воксель і обчислює відповідну формулу? Як би ви кодували функції функцій у цій формулі? Як би ви оцінили функції у довільних точках?

Я прочитав книгу "Цифрова обробка зображень" Гонсалеса та Вудса, але все ще втрачаю. Я також читав про серії книг «Числові рецепти». Це був би правильний шлях?

Які ваші алгоритми програмування досвіду з наукових робіт? Якісь поради чи пропозиції?


1
Я погляну на папір, коли матиму можливість. Але я вважаю, що це все стосується точок XYZ у даній графіці. Ви визначаєте вершину, а потім працюєте звідти.

2
Зазвичай, дискретизує сигнали шляхом вибірки, а потім перетворює інтеграли в суми.
nibot

Отже, я читав про вибірку та перетворення інтегралів на суми, але як ви оцінюєте інтеграл у кожній точці вибірки, якщо функції інтеграла зберігаються як матриці?

1
Даміан, ти бачив, як перетворюється перетворення радону за допомогою зворотного проектування? Це трохи простіший приклад, який я міг би пояснити, якби це вас зацікавило. Він використовується для томографії з використанням плоских хвиль, а не конічної вибірки, описаної в публікації, яку ви опублікували. en.wikipedia.org/wiki/Radon_transform
nibot

1
@ mr-crt, чи можна замість цього перейти на dsp.SE?
нібот

Відповіді:


15

Алгоритми обробки сигналів, визначені в безперервному часі / просторі / частоті, зазвичай реалізуються шляхом вибірки сигналу на дискретній сітці та перетворення інтегралів в суми (а похідні в різниці). Просторові фільтри реалізуються за допомогою згортки з ядром згортання (тобто зваженою сумою сусідів).

Існує величезна кількість знань щодо фільтрації вибіркових сигналів часової області; фільтри часової області реалізуються як фільтри кінцевих імпульсних характеристик , де поточна вибірка обчислюється як зважена сума попередніх 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]');

Те, що колись було інтегралом щільності вздовж променя, тепер є сумою над стовпчиком дискретно вибіреного зображення, яке, в свою чергу, було знайдено інтерполяцією вихідного зображення на трансформовану систему координат.


Вау @ніbot, дякую за таку детальну відповідь. Я взяв клас "алгоритми та структури даних", але не бачу зв'язку між представленим там матеріалом та впровадженням наукових алгоритмів. Я прочитаю посилання, які ви мені дали, і почну займатися з більш простими алгоритмами (з книг замість паперів). Ще раз дякую
Даміан

Привіт, Даміан, я відредагував свою відповідь, щоб адресувати ваш коментар. Я думаю, ви знайдете те, що шукаєте в курсі чи книзі про числові методи / чисельний аналіз.
nibot

По всій відповіді!
Віктор Сорокін

@nibot: дякую за редагування. Мені дуже подобається курс чисельного аналізу, який ви зв'язали. Чому "фільтри кінцевих імпульсних реакцій" пов'язані з інтерполяцією? Цікаво, чому це не є частиною навчальної програми як студента ЗНО. Що ж, добре. Спасибі!
Даміан

@Damian: теорія вибірки, інтерполяція / децимація, перетворення Z, білінеарне перетворення та фільтри FIR / IIR викладаються в студентських класах / лабораторіях EE, таких як сигнали та системи, системи зв’язку, лінійні системи управління та введення в DSP. Я взяв числові методи як частину програми подвійного ступеня в комп'ютерній техніці; Я не думаю, що цього потрібно вимагати від загальноосвітніх підприємств.
Ерік Нд

3

Додавши до відмінного пояснення nibot , лише ще пару пунктів.

  • Числові обчислювальні середовища, такі як MATLAB, Octave або SciPy / NumPy, заощадять вам багато зусиль у порівнянні з тим, щоб робити все самостійно в загальній мові програмування, такі як C ++. Жонглювання doubleмасивами та циклами просто не порівнюється з наявністю типів даних, таких як складні числа та операції, такі як інтеграли під рукою. (Це можна зробити точно, і хороший код C ++ може бути на порядок швидше; при хороших абстракціях і шаблонах бібліотеки він може бути навіть досить чистим і зрозумілим, але це, звичайно, простіше починати, наприклад, з MATLAB.)

  • MATLAB також має "набори інструментів", наприклад, для обробки зображень та обробки цифрових сигналів , які можуть допомогти дуже багато, залежно від того, що ви робите.

  • Цифрова обробка сигналів Mitra - це хороша книга, щоб вивчити (в MATLAB!) Основи дискретного часу, фільтри, перетворення тощо. Це майже обов'язкові знання для виконання будь-яких гідних технічних алгоритмів.

Так, я прочитав документацію інструменту обробки зображень. Мені здається надзвичайно корисним, але моє питання було спрямоване на реалізацію чогось подібного. В основному, я хотів знати, як взяти математичний алгоритм / формулу та реалізувати його (як Mathworks зробив із IPT). Мені хотілося дізнатися про схему думки чи деякі вказівки. Я перегляну книгу Мітри. Спасибі!
Даміан

1
Щоб додати до наведеної відповіді, набори інструментів C ++, такі як Armadillo, можуть значно спростити перетворення коду Matlab у швидкий код C ++. Синтаксис Армаділло схожий на Матлаб. Ви також можете змішати код Matlab і код C ++ через мекси-інтерфейс Armadillo.
mtall

2

Числові методи. Це, як правило, університетський курс вищої ланки та підручник.

DSP зазвичай знаходиться поблизу перетину числових методів та ефективної реалізації. Якщо ви ігноруєте ефективність, то, що ви можете шукати, це будь-який метод числового наближення, який може дати результат "достатньо точний" для рівнянь (-ів) технічного документу, що цікавлять. Іноді можна мати справу з вибірковими даними, де теореми вибірки дадуть певні межі як методу збору даних (попередня фільтрація), так і діапазону або якості результатів, які ви можете отримати з урахуванням цих даних.

Іноді Matlab, числові рецепти чи різні бібліотеки обробки зображень / сигналів матимуть ефективні алгоритми або код для потрібного числового рішення. Але іноді вам може знадобитися прокрутити свій власний, тому це допомагає знати математику, що лежить в основі різних методів чисельного рішення. І це сама по собі велика тема.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.