Các thuật toán xử lý tín hiệu được xác định theo thời gian / không gian / tần số liên tục thường được thực hiện bằng cách lấy mẫu tín hiệu trên lưới rời rạc và chuyển đổi các tích phân thành tổng (và các dẫn xuất thành khác biệt). Các bộ lọc không gian được thực hiện thông qua tích chập với hạt nhân chập (tức là tổng trọng số của hàng xóm).
Có một khối lượng kiến thức khổng lồ liên quan đến việc lọc các tín hiệu miền thời gian được lấy mẫu; Bộ lọc miền thời gian được triển khai dưới dạng bộ lọc đáp ứng xung hữu hạn , trong đó mẫu đầu ra hiện tại được tính là tổng trọng số của các mẫu đầu vào N trước đó; hoặc các bộ lọc đáp ứng xung vô hạn, trong đó đầu ra hiện tại là tổng trọng số của các đầu vào trước và đầu ra trước đó . Chính thức, các bộ lọc thời gian riêng biệt được mô tả bằng cách sử dụng biến đổi z , là tương tự thời gian rời rạc với biến đổi Laplace . Phép biến đổi song tuyến ánh xạ cái này sang cái kia ( c2d
và d2c
trong Matlab).
Làm thế nào bạn sẽ đánh giá các chức năng tại các điểm tùy ý?
Khi bạn cần giá trị của tín hiệu tại một điểm không nằm trực tiếp trên lưới lấy mẫu của bạn, bạn sẽ nội suy giá trị của nó từ các điểm lân cận. Nội suy có thể đơn giản như chọn mẫu gần nhất, tính trung bình trọng số của các mẫu gần nhất hoặc khớp hàm phân tích phức tạp tùy ý với dữ liệu được lấy mẫu và đánh giá hàm này theo tọa độ cần thiết. Nội suy trên một lưới tốt hơn thống nhất là upampling . Nếu tín hiệu gốc (liên tục) của bạn không chứa chi tiết (tức là tần số) nhỏ hơn một nửa lưới lấy mẫu, thì chức năng liên tục có thể được tái tạo hoàn hảo từ phiên bản được lấy mẫu ( định lý lấy mẫu Nyquist-Shannon ). Để biết ví dụ về cách bạn có thể nội suy trong 2D, hãy xemnội suy song tuyến .
Trong Matlab, bạn có thể sử dụng interp1
hoặc interp2
nội suy dữ liệu 2D được lấy mẫu thường xuyên (tương ứng) hoặc griddata
để nội suy từ dữ liệu 2D được lấy mẫu bất thường.
Bạn sẽ có một vòng lặp đi qua từng voxel và tính toán công thức tương ứng?
Đúng chính xác.
Matlab giúp bạn không phải làm điều này thông qua các vòng lặp rõ ràng vì nó được thiết kế để hoạt động trên ma trận và vectơ (tức là mảng nhiều chiều). Trong Matlab, điều này được gọi là "vector hóa". Tích phân xác định có thể xấp xỉ với sum
, cumsum
, trapz
, cumtrapz
vv
Tôi đã đọc cuốn sách "Xử lý hình ảnh kỹ thuật số" của Gonzalez và Woods nhưng tôi vẫn cảm thấy hụt hẫng. Tôi cũng đã đọc về bộ sách Bí quyết số. Đó sẽ là cách chính xác?
Vâng, Bí quyết số sẽ là một khởi đầu tuyệt vời. Nó rất thực tế và bao gồm hầu hết các phương pháp số bạn sẽ cần. (Bạn sẽ thấy Matlab đã thực hiện mọi thứ bạn cần, nhưng Công thức số sẽ cung cấp nền tảng tuyệt vời.)
Tôi đã tham gia một lớp "thuật toán và cấu trúc dữ liệu", nhưng tôi không thấy mối quan hệ giữa các tài liệu được trình bày ở đó và thực hiện các thuật toán khoa học.
Tài liệu được xử lý trong các khóa học "Thuật toán và cấu trúc dữ liệu" có xu hướng tập trung vào các cấu trúc như danh sách, mảng, cây và đồ thị có chứa số nguyên hoặc chuỗi và các hoạt động như sắp xếp và chọn: các vấn đề thường có một kết quả đúng. Khi nói đến các thuật toán khoa học, đây chỉ là một nửa câu chuyện. Nửa còn lại quan tâm đến các phương pháp để ước tính số thực và các hàm phân tích. Bạn sẽ tìm thấy điều này trong một khóa học về "Phương pháp số" (hoặc "Phân tích số"; như thế này- cuộn xuống cho các trang chiếu): cách ước tính các hàm đặc biệt, cách ước tính tích phân và đạo hàm, v.v ... Ở đây, một trong những nhiệm vụ chính là ước tính độ chính xác của kết quả của bạn và một mô hình phổ biến là lặp lại một thói quen giúp cải thiện một thói quen ước tính cho đến khi nó đủ chính xác. (Bạn có thể tự hỏi làm thế nào Matlab biết cách làm điều gì đó đơn giản như ước tính giá trị của sin(x)
một số người x
.)
Một ví dụ đơn giản, đây là một đoạn script ngắn tính toán biến đổi radon của một hình ảnh trong Matlab. Biến đổi radon có các hình chiếu của một hình ảnh trên một tập hợp các góc chiếu. Thay vì cố gắng tính toán hình chiếu dọc theo một góc tùy ý, thay vào đó tôi xoay toàn bộ hình ảnh bằng cách sử dụng imrotate
, để hình chiếu luôn luôn thẳng đứng. Sau đó, chúng ta có thể thực hiện phép chiếu đơn giản bằng cách sử dụng sum
, vì sum
ma trận trả về một vectơ chứa tổng trên mỗi cột.
Bạn có thể tự viết imrotate
nếu bạn thích, sử dụng 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]');
Thứ từng là một tích phân của mật độ dọc theo một tia giờ là tổng của một cột của một hình ảnh được lấy mẫu riêng biệt, lần lượt được tìm thấy bằng cách nội suy ảnh gốc trên một hệ tọa độ được chuyển đổi.