2012-11-15 31 views
6

Tôi có một hình ảnh mà tôi muốn chuyển sang miền tần số bằng FFT, có vẻ như thiếu thư viện cho điều này cho Java nhưng tôi đã tìm thấy hai. Một là JTransforms và cái kia ít được biết đến hơn và không có tên.JTransforms FFT trên hình ảnh

Với mô hình 2D ít phổ biến hơn, chỉ có thể sử dụng các phương thức như là FastFourierTransform.fastFT(real, imaginary, true); với thực tế là mảng 2D có đầy đủ mọi giá trị pixel và phần ảo là 2D mảng có cùng kích thước với số 0. Giá trị Boolean sẽ phụ thuộc vào biến đổi tiến hoặc đảo ngược. Điều này có ý nghĩa với tôi và nó hoạt động ngoại trừ sức mạnh của hai yêu cầu làm hỏng mọi biến đổi tôi đã làm (ban đầu tôi thêm không gian màu đen xung quanh hình ảnh để phù hợp với sức mạnh gần nhất của hai hình ảnh). để sử dụng các phương thức tương đương cho JTransforms và sẽ đánh giá cao bất kỳ hướng dẫn nào khi làm như vậy. Tôi sẽ nói những gì tôi đang làm.

Tôi tin rằng lớp có liên quan sẽ là DoubleFFT_2D, hàm tạo của nó có một số hàng và cột mà tôi cho là chiều rộng và chiều cao của hình ảnh. Vì hình ảnh của tôi không có phần tưởng tượng nên tôi nghĩ rằng tôi có thể sử dụng doubleFFT.realForwardFull(real); để xử lý các phần tưởng tượng bằng không và truyền mảng 2D thực có đầy đủ pixel. Thật không may điều này không làm việc cả. Các JavaDoc tiểu bang the input array must be of size rows*2*columns, with only the first rows*columns elements filled with real data Nhưng tôi không thấy làm thế nào điều này liên quan đến hình ảnh của tôi và những gì tôi sẽ phải làm gì để đáp ứng yêu cầu này.

Xin lỗi vì lời giải thích dài và kém, nếu cần thêm thông tin, tôi rất sẵn lòng cung cấp.

JTransforms Thư viện và Docs có thể được tìm thấy ở đây: https://sites.google.com/site/piotrwendykier/software/jtransforms

Trả lời

5

Đó là quá xấu tài liệu cho JTransforms không có sẵn trực tuyến khác hơn là một nén download. Nó rất hoàn chỉnh và hữu ích, bạn nên kiểm tra nó ra!

Để trả lời câu hỏi của bạn: DoubleFFT_2D.realForwardFull(double[][] a) lấy một dãy số thực (pixel của bạn). Tuy nhiên, kết quả của FFT sẽ có hai giá trị đầu ra cho mỗi giá trị đầu vào - một phần thực và phần ảo của mỗi bin tần số. Đây là lý do tại sao mảng đầu vào của bạn cần phải lớn gấp hai lần mảng hình ảnh thực tế, với một nửa của nó rỗng/đầy zeroes. Lưu ý rằng tất cả các chức năng FFT sử dụng a không chỉ cho đầu vào, mà còn cho đầu ra - điều này có nghĩa là bất kỳ dữ liệu hình ảnh trong đó sẽ bị mất, do đó, nó có thể được mong muốn để sao chép vào một mảng khác nhau/lớn hơn anyway!

Sửa lỗi dễ dàng và rõ ràng cho kịch bản của bạn sẽ sử dụng DoubleFFT_2D.realForward(double[][] a) để thay thế. Điều này sẽ chỉ tính toán phổ tích cực, bởi vì mặt tiêu cực sẽ đối xứng với nó. Điều này là do giá trị đầu vào của bạn là có thật.

Ngoài ra, hãy kiểm tra các lớp RealFFTUtils_2D trong JTransforms, mà sẽ làm cho nó dễ dàng hơn nhiều để bạn có thể lấy kết quả của bạn từ các mảng sau đó :)

+0

Trên thực tế, nó xuất hiện (mới hơn) docs đang trực tuyến tại github : http://wendykierp.github.io/JTransforms/apidocs/ –