Thực hiện các thuật toán giấy kỹ thuật trong C ++ hoặc MATLAB


14

Tôi là sinh viên ngành Kỹ thuật Điện. Tôi đã đọc nhiều tài liệu kỹ thuật về các thuật toán xử lý tín hiệu và hình ảnh (tái tạo, phân đoạn, lọc, v.v.). Hầu hết các thuật toán hiển thị trong các bài báo này được xác định theo thời gian liên tục và tần số liên tục, và thường đưa ra các giải pháp theo các phương trình phức tạp. Làm thế nào bạn có thể triển khai một bài viết kỹ thuật từ đầu trong C ++ hoặc MATLAB để sao chép các kết quả thu được trong bài báo nói trên?

Cụ thể hơn, tôi đã xem bài báo "Một thuật toán tái tạo chùm tia tổng quát" của Wang và cộng sự ( Hình ảnh của Trans Trans. 1993; 12 (3): 486-96 ), và tôi đã tự hỏi, làm thế nào để tôi bắt đầu thực hiện thuật toán của họ? Công thức 10 cung cấp cho bạn công thức của hình ảnh được xây dựng lại tại. Làm thế nào bạn sẽ mã đó lên? 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? Làm thế nào bạn sẽ mã chức năng của các chức năng trong công thức đó? Làm thế nào bạn sẽ đánh giá các chức năng tại các điểm tùy ý?

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?

Kinh nghiệm lập trình thuật toán của bạn từ các tài liệu nghiên cứu là gì? Bất kỳ lời khuyên hoặc đề nghị?


1
Tôi sẽ xem bài báo khi có cơ hội. Nhưng tôi tin rằng đây là tất cả về điểm XYZ trong một đồ họa nhất định. Bạn xác định một đỉnh và sau đó làm việc từ đó.

2
Thông thường, người ta phân biệt các tín hiệu bằng cách lấy mẫu và sau đó chuyển đổi các tích phân thành tổng.
nibot

Vì vậy, tôi đã đọc về lấy mẫu và chuyển đổi các tích phân thành tổng, nhưng làm thế nào để bạn đánh giá tích phân tại mỗi điểm lấy mẫu nếu các hàm trong tích phân được lưu trữ dưới dạng ma trận?

1
Damian, bạn đã thấy cách biến đổi radon được đảo ngược thông qua phản xạ ngược chưa? Đây là một ví dụ đơn giản hơn một chút mà tôi có thể giải thích nếu nó làm bạn quan tâm. Nó được sử dụng để chụp cắt lớp bằng cách sử dụng sóng phẳng thay vì lấy mẫu hình nón được mô tả trong bài báo bạn đăng. vi.wikipedia.org/wiki/Radon_transform
nibot

1
@ mr-crt, thay vào đó có thể di chuyển sang dsp.SE không?
nibot

Câu trả lời:


15

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 ( c2dd2ctrong 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 interp1hoặc interp2nộ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, cumtrapzvv

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ì summa trận trả về một vectơ chứa tổng trên mỗi cột.

Bạn có thể tự viết imrotatenế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.


Wow @nibot, cảm ơn bạn đã trả lời chi tiết như vậy. 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 sẽ đọc các liên kết bạn đưa cho tôi và bắt đầu thực hành với các thuật toán đơn giản hơn (từ sách thay vì giấy tờ). Cảm ơn một lần nữa
Damian

Xin chào Damian, tôi đã chỉnh sửa câu trả lời của mình để giải quyết bình luận của bạn. Tôi nghĩ bạn sẽ tìm thấy những gì bạn tìm kiếm trong một khóa học hoặc cuốn sách về phương pháp số / phân tích số.
nibot

Xuyên suốt câu trả lời!
Victor Sorokin

@nibot: cảm ơn vì đã chỉnh sửa. Tôi thực sự thích các khóa học phân tích số bạn liên kết. Tại sao "bộ lọc đáp ứng xung hữu hạn" được liên kết với phép nội suy? Tôi tự hỏi tại sao đây không phải là một phần của chương trình giảng dạy như một sinh viên EE. Ồ tốt Cảm ơn!
Damian

@Damian: Lý thuyết lấy mẫu, nội suy / số thập phân, biến đổi Z, biến đổi song tuyến và bộ lọc FIR / IIR được dạy trong các lớp / phòng thí nghiệm EE đại học như tín hiệu và hệ thống, hệ thống truyền thông, hệ thống điều khiển tuyến tính và giới thiệu về DSP. Tôi đã sử dụng các phương pháp số như là một phần của chương trình bằng kép trong kỹ thuật máy tính; Tôi không nghĩ rằng nó nên được yêu cầu của EE nói chung.
Eryk CN

3

Thêm vào lời giải thích tuyệt vời của nibot , chỉ cần thêm một vài điểm.

  • Các môi trường điện toán số như MATLAB, Octave hoặc SciPy / NumPy sẽ giúp bạn tiết kiệm rất nhiều nỗ lực so với việc tự mình làm tất cả bằng một ngôn ngữ lập trình chung như C ++. Việc tung hứng với doublecác mảng và vòng lặp không thể so sánh với việc có các kiểu dữ liệu như số phức và thao tác như tích phân trong tầm tay bạn. (Chắc chắn là có thể thực hiện được và mã C ++ tốt có thể nhanh hơn rất nhiều, với các tóm tắt và mẫu thư viện tốt, nó thậm chí có thể sạch và rõ ràng một cách hợp lý, nhưng chắc chắn dễ dàng hơn để bắt đầu với MATLAB.)

  • MATLAB cũng có "bộ công cụ" ví dụ: Xử lý hình ảnhXử lý tín hiệu số , có thể giúp ích rất nhiều, tùy thuộc vào những gì bạn làm.

  • Xử lý tín hiệu số của Mitra là một cuốn sách hay để học (trong MATLAB!) Những điều cơ bản về thời gian riêng biệt, bộ lọc, biến đổi, v.v ... đó là kiến ​​thức bắt buộc để thực hiện bất kỳ thuật toán kỹ thuật tốt nào.

Có, tôi đã đọc tài liệu của Toolboox. Tôi có vẻ cực kỳ hữu ích, nhưng câu hỏi của tôi đã hướng đến việc thực hiện một cái gì đó như thế. Về cơ bản, tôi muốn biết làm thế nào để sử dụng một thuật toán / công thức toán học và thực hiện nó (giống như Mathworks đã làm với IPT). Tôi muốn biết về mô hình suy nghĩ hoặc một số hướng dẫn. Tôi sẽ xem cuốn sách của Mitra. Cảm ơn!
Damian

1
Để thêm vào câu trả lời ở trên, bộ công cụ C ++ như Armadillo có thể đơn giản hóa rất nhiều việc chuyển đổi mã Matlab thành mã C ++ nhanh. Cú pháp của Armadillo tương tự như Matlab. Bạn cũng có thể trộn mã Matlab và C ++ thông qua giao diện mex của Armadillo.
mtall

2

Phương pháp số. Nó thường là một khóa học đại học và sách giáo khoa.

DSP thường ở gần giao điểm của các phương thức số và thực hiện hiệu quả. Nếu bạn bỏ qua hiệu quả, thì điều bạn có thể tìm kiếm là bất kỳ phương pháp gần đúng số nào có thể tạo ra kết quả "đủ chính xác" cho (các) phương trình kỹ thuật quan tâm. Đôi khi người ta có thể xử lý dữ liệu được lấy mẫu, trong đó các định lý lấy mẫu sẽ đặt một số giới hạn cho cả phương pháp thu thập dữ liệu (lọc trước) và phạm vi hoặc chất lượng kết quả mà bạn có thể nhận được từ dữ liệu đó.

Đôi khi Matlab, công thức số hoặc thư viện xử lý tín hiệu / hình ảnh khác nhau sẽ có thuật toán hoặc mã hiệu quả cho giải pháp số mong muốn. Nhưng đôi khi bạn có thể phải tự lăn, vì vậy nó giúp biết toán học đằng sau các phương pháp giải toán số khác nhau. Và đó là một chủ đề lớn theo đúng nghĩa của nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.