FFT để phát hiện dòng


8

Tôi đang cố gắng sử dụng FFT theo một cách khác sau đó hầu hết mọi người hỏi về. Tôi muốn có thể chụp ảnh biểu đồ với các đường thẳng đứng lặp lại đều đặn và xử lý hình ảnh để xác định trung bình các pixel cách nhau bao xa. Tôi đã thử phát hiện cạnh canny và phát hiện dòng hough và tôi không nghĩ rằng tôi có thể tối ưu hóa hình ảnh đủ để chỉ phát hiện chính xác những dòng tôi quan tâm.

Vì vậy, nỗ lực của tôi là quét 10 dòng ảnh và tích lũy các giá trị pixel vào các thùng tương ứng với cột pixel. Kết quả là gì khi bạn vẽ biểu đồ nó là một dạng sóng xuất hiện rất độc đáo. Khi tôi thực hiện DFT hoặc FFT về điều này, tôi có thể tìm thấy một đỉnh mà tôi tin là tần số của sự lặp lại dòng. (Đây có thể là một giả định bị lỗi)

Câu hỏi của tôi là, con số này tương ứng với cái gì? tức là tôi nghĩ rằng tôi đang bối rối với tốc độ lấy mẫu của mình sẽ là bao nhiêu bởi vì nó được tính bằng pixel. Tôi nghĩ rằng đây là một cách sử dụng FFT hợp lệ, nhưng tôi đang rơi vào thời điểm này khi tôi nghĩ mình nên thành công.

Làm ví dụ Tôi đã tạo một hình ảnh có chiều rộng 300 pixel. Có các dòng chiều rộng 1 pixel được vẽ ở các khoảng chính xác 30 pixel. Tôi tìm thấy 2 đỉnh, một ở 75 và một ở 225 (có vẻ như đối xứng) cho thành phần thực. (Tôi không tin rằng thành phần tưởng tượng sẽ phát trong ??) Tôi biết các dòng cách nhau 30 pixel. Làm thế nào để 75 và 225 liên quan?

Tôi đang rất cố gắng để có được điều này, và tôi rất biết ơn về bất kỳ sự giúp đỡ nào bạn có thể đề nghị. Tại thời điểm này, tôi đang từ bỏ phát hiện cạnh, và muốn thử phương pháp này.

Cảm ơn bạn trước.

image  opencv  fft  dft 

Cảm ơn tất cả các bạn rất nhiều cho câu trả lời của bạn! FFT dường như không hoạt động. Làm thế nào tôi có thể thêm vào trong thành phần tưởng tượng? Chương trình tôi sử dụng (stat plus) chỉ tạo ra một cột gồm các số thực và ảo. Tôi đã vẽ đồ thị trên trục x, nhưng tôi chắc chắn có một cách tốt hơn để tôi có thể bao gồm các số ảo. Ngoài ra, tôi đã đi vào con đường tự kỷ và có kết quả! ngọt ngào!, nhưng nó luôn mang đến nhiều câu hỏi hơn Kết quả tôi nhận được là gấp đôi kích thước của bức ảnh gốc (có thể hiểu được), dao động sạch hơn gần trung tâm. Có bất kỳ vần điệu hoặc lý do để

Câu trả lời:


6

Bạn có thể nhìn vào việc thử Autocorrelation cho việc này. Dưới đây là câu trả lời SO mô tả cách thực hiện tự động tương quan với Matlab bằng FFT. Điều này có thể được mở rộng cho hai chiều.

Tôi đã triển khai trường hợp thử nghiệm của bạn trong numpy như sau:

a = np.zeros(300)
a[::30] = 1
plt.acorr(a, maxlags=50)

Điều này đưa ra cốt truyện sau:

nhập mô tả hình ảnh ở đây

Như bạn có thể thấy, các đỉnh bật lên ở mức +/- 30.


4

Nếu có 10 dòng dọc trong hình ảnh của bạn, thì FFT của một dòng quét ngang đầy đủ (300 pix) sẽ hiển thị một số nội dung cường độ xung quanh bin 10 hoặc bin 11. Bin 75 trên 300 sẽ cho biết điều gì đó đang xảy ra ở mỗi pixel thứ 4, hoặc vì thế.

Bạn thực sự cần phải xem xét độ lớn của kết quả FFT, không chỉ là thành phần "thực" (thực sự là thành phần chẵn) bởi vì, nếu các đường lưới của bạn nằm lệch tâm, nội dung quang phổ có thể hiển thị dưới dạng lẻ (do đó là "tưởng tượng" trong kết quả FFT).

Đưa ra đầu vào thực sự cho một FFT, các thùng kết quả trên N / 2 (trên 150 trong trường hợp của bạn) chỉ chứa các lần lặp lại của cùng một dữ liệu ngoại trừ liên hợp phức tạp. Vì vậy, bạn có thể bỏ qua chúng.


0

Tôi không có nhiều ý tưởng, nhưng để làm cho trực quan trực quan, bạn có thể thử căn giữa (nhân từng giá trị trong với . Khi bạn đã thực hiện điều này, thành phần DC của bạn xuất hiện ở trung tâm, với toàn bộ đối xứng xung quanh nó.F F T F F T ( - 1 ) ( x + y ) ) F F TFFTFFTFFT(1)(x+y))FFT

Tôi không chắc lắm về điều này, nhưng một cái gì đó cho tôi biết rằng khoảng cách (tính bằng pixel) giữa đỉnh và tâm sau đó sẽ biểu thị tính tuần hoàn. Một khi bạn có tính định kỳ, bạn có thể dễ dàng đến khoảng cách giữa mỗi đối tượng.

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.