Algoritma pemrosesan sinyal yang didefinisikan dalam waktu / ruang / frekuensi kontinu biasanya diimplementasikan dengan mengambil sampel sinyal pada kisi-kisi diskrit dan mengubah integral menjadi jumlah (dan turunannya menjadi perbedaan). Filter spasial diimplementasikan melalui konvolusi dengan kernel konvolusi (yaitu jumlah tetangga tertimbang).
Ada banyak sekali pengetahuan tentang memfilter sinyal waktu-domain sampel; filter time-domain diimplementasikan sebagai filter respon impuls terbatas , di mana sampel keluaran saat ini dihitung sebagai jumlah tertimbang dari sampel input N sebelumnya; atau filter respon impuls tak terbatas, di mana output saat ini adalah jumlah tertimbang dari input sebelumnya dan output sebelumnya . Secara formal, filter waktu diskrit dijelaskan menggunakan z-transform , yang merupakan analog waktu diskrit dengan transformasi Laplace . The bilinear transform peta satu ke yang lain ( c2d
dan d2c
di Matlab).
Bagaimana Anda mengevaluasi fungsi pada titik-titik yang berubah-ubah?
Ketika Anda membutuhkan nilai sinyal pada titik yang tidak terletak langsung di kisi-kisi sampling Anda, Anda menyisipkan nilainya dari titik terdekat. Interpolasi dapat sesederhana memilih sampel terdekat, menghitung rata-rata tertimbang dari sampel terdekat, atau menyesuaikan fungsi analitik rumit yang rumit dengan data sampel dan mengevaluasi fungsi ini pada koordinat yang diperlukan. Interpolasi ke grid yang lebih halus seragam adalah upsampling . Jika sinyal asli Anda (kontinu) tidak mengandung perincian (yaitu frekuensi) yang lebih baik dari setengah kisi pengambilan sampel, maka fungsi kontinu dapat direkonstruksi dengan sempurna dari versi sampel ( teorema pengambilan sampel Nyquist-Shannon ). Untuk contoh bagaimana Anda bisa melakukan interpolasi dalam 2D, lihatinterpolasi bilinear .
Dalam Matlab Anda dapat menggunakan interp1
atau interp2
untuk menginterpolasi 1D atau secara teratur mengambil sampel data 2D (masing-masing), atau griddata
untuk menginterpolasi dari data 2D yang diambil secara tidak teratur.
Apakah Anda memiliki for-loop melalui masing-masing voxel dan menghitung formula yang sesuai?
Ya persis.
Matlab menyelamatkan Anda dari keharusan melakukan ini melalui for-loop eksplisit karena ia dirancang untuk beroperasi pada matriks dan vektor (yaitu array multidimensi). Dalam Matlab ini disebut "vektorisasi". Integral tertentu dapat didekati dengan sum
, cumsum
, trapz
, cumtrapz
, dll
Saya sudah membaca buku "Pemrosesan Gambar Digital" oleh Gonzalez dan Woods tapi saya masih bingung. Saya juga membaca tentang seri buku Resep Numerik. Apakah itu cara yang benar?
Ya, Resep Numerik akan menjadi awal yang baik. Ini sangat praktis dan mencakup sebagian besar metode numerik yang akhirnya Anda perlukan. (Anda akan menemukan bahwa Matlab sudah mengimplementasikan semua yang Anda butuhkan, tetapi Numerical Recipes akan memberikan latar belakang yang sangat baik.)
Saya telah mengambil kelas "algoritma dan struktur data", tetapi saya tidak melihat hubungan antara materi yang disajikan di sana dan menerapkan algoritma ilmiah.
Materi yang diperlakukan dalam kursus "Algoritma dan struktur data" cenderung berkonsentrasi pada struktur seperti daftar, array, pohon, dan grafik yang mengandung bilangan bulat atau string dan operasi seperti menyortir dan memilih: masalah yang biasanya ada satu hasil yang benar. Ketika datang ke algoritma ilmiah, ini hanya setengah dari cerita. Setengah lainnya menyangkut metode untuk memperkirakan bilangan real dan fungsi analitik. Anda akan menemukan ini dalam kursus "Metode Numerik" (atau "Analisis Numerik"; seperti ini- gulir ke bawah untuk slide): cara memperkirakan fungsi khusus, cara memperkirakan integral dan turunannya, dll. Di sini salah satu tugas utama adalah memperkirakan keakuratan hasil Anda, dan satu pola umum adalah untuk mengulangi rutin yang meningkatkan memperkirakan sampai cukup akurat. (Anda mungkin bertanya pada diri sendiri bagaimana Matlab tahu bagaimana melakukan sesuatu yang sederhana seperti memperkirakan nilai sin(x)
untuk beberapa orang x
.)
Sebagai contoh sederhana, berikut ini adalah skrip pendek yang menghitung transformasi radon dari sebuah gambar di Matlab. Transformasi radon mengambil proyeksi gambar di atas sekumpulan sudut proyeksi. Alih-alih mencoba menghitung proyeksi sepanjang sudut sewenang-wenang, saya malah memutar seluruh gambar menggunakan imrotate
, sehingga pengambilan proyeksi selalu vertikal. Kemudian kita dapat mengambil proyeksi hanya menggunakan sum
, karena sum
matriks mengembalikan vektor yang berisi jumlah dari setiap kolom.
Anda dapat menulis sendiri imrotate
jika Anda suka, menggunakan 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]');
Apa yang tadinya merupakan bagian integral dari kerapatan sepanjang sinar sekarang adalah jumlah di atas kolom gambar sampel yang diambil secara terpisah, yang pada gilirannya ditemukan dengan menginterpolasi gambar asli melalui sistem koordinat yang diubah.