FFT dữ liệu hình ảnh: Sao chép phản chiếu trực tuyến để tránh hiệu ứng ranh giới


8

Tôi tải và hiển thị hình ảnh của một số gạo trong Matlab:

g = imread('rice.png');
imshow(g);

cơm

Tôi lấy FFT của hình ảnh này và thay đổi nó:

G = fft2(g);
imshow(log(abs(fftshift(G)) + 1), []);

FFT (gạo)

Nếu tôi đặt trục rìu và trục y vào tâm của hình ảnh; Tôi thấy rằng hình ảnh là đối xứng g (-x, -y) = g (x, y). Đối với tín hiệu 1D, chúng ta có FFT của tín hiệu thực có phần thực đối xứng và phần ảo không đối xứng. Tôi đoán đó là những gì chúng ta thấy ở đây trong 2 chiều?

Vì ảnh gốc tối hơn ở phía dưới so với ở trên cùng, nên có sự gián đoạn ngang mạnh mẽ ở ranh giới định kỳ gây ra đường thẳng đứng trong FFT.

Tôi muốn thoát khỏi hiệu ứng ranh giới này. Một cách tiếp cận phổ biến cho điều này dường như là cửa sổ .

Tuy nhiên tôi muốn giải quyết vấn đề này bằng một kỹ thuật tôi tìm thấy trong một bài báo gọi là "phản chiếu". Bài viết không cụ thể lắm nên tôi cần sự giúp đỡ của bạn trong việc tìm ra phương pháp này :-).

Đầu tiên tôi tạo một "ô" đối xứng từ ảnh gốc:

tile=[flipdim(g,2) g; flipdim(flipdim(g,1),2) flipdim(g,1)];
imshow(tile);

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

Bây giờ tôi lấy FFT của "ô" này:

Tile=fft2(tile);
imshow(log(abs(fftshift(Tile)) + 1), []) 

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

Đường thẳng đứng dường như (gần như) biến mất: tốt. Tuy nhiên, sự phản chiếu dường như đã giới thiệu đối xứng hơn.

Kết quả chính xác là gì: FFT của ảnh gốc hoặc FFT của ảnh "nhân đôi"?

Có cách nào tôi có thể "phản chiếu" để cả hai tôi thoát khỏi các hiệu ứng ranh giới và có được một FFT hoàn toàn thực sự không?

Cảm ơn trước cho bất kỳ câu trả lời!

Câu trả lời:


13

FFT của hình ảnh gốc là chính xác. Các tạo phẩm bạn đang thấy là điển hình cho DFT, vì các hàm cơ sở DFT gặp khó khăn khi biểu diễn các tín hiệu không định kỳ. Mặc dù DFT có độ dài hữu hạn, nó thực sự đại diện cho một tín hiệu định kỳ kéo dài đến vô cực âm và dương. Các hàm cơ bản của DFT là tất cả các hình sin có chu kỳ là ước số nguyên của kích thước DFT, vì vậy tất cả chúng đều bắt đầu và kết thúc ở cùng một giá trị, và thật khó để nó phù hợp với các tín hiệu không theo định kỳ theo cách này. Vì vậy, hãy tưởng tượng ốp lát hình ảnh của bạn: thực sự có một sự gián đoạn đột ngột ở các cạnh. Các cạnh không khớp với nhau và đó là lý do cho các hiệu ứng biên.

Trong xử lý tín hiệu âm thanh, trong đó FFT được sử dụng thường xuyên, một cách tiếp cận rất phổ biến là sử dụng chức năng cửa sổ , như bạn đã lưu ý. Điều này làm giảm các cạnh về 0 và làm giảm hiệu ứng này.

Trong xử lý ảnh, DCT thường được sử dụng thay vì DFT, vì nó áp đặt các ràng buộc đối xứng khác nhau mang lại kết quả tốt hơn. Nói cách khác, nó được sử dụng để ngăn chặn chính xác vấn đề bạn đang gặp phải. Trái ngược với các hàm cơ sở của DFT (hãy nhớ cách tất cả chúng bắt đầu và kết thúc ở cùng một giá trị), các hàm cơ sở của DCT là các ước số nguyên hoặc một nửa các ước số nguyên, vì vậy nhiều trong số chúng bắt đầu và kết thúc ở các giá trị khác nhau. Kết quả là, các điều kiện biên ngụ ý là khác nhau: tín hiệu được coi là đối xứng về các cạnh của nó, điều này thực sự hơi giống với "phản chiếu" mà bạn đang thử nghiệm. Đây là một bài viết khác của tôi với một chút thông tin về DCT: https://dsp.stackexchange.com/a/362/392

Vì vậy, như một bản tóm tắt ngắn, nếu bạn hoàn toàn được thiết lập bằng cách sử dụng FFT, bạn có thể muốn thử cửa sổ. Tuy nhiên, lựa chọn tốt nhất có lẽ là sử dụng DCT, ngụ ý các điều kiện biên tương tự như ý tưởng "phản chiếu" của bạn và kết quả là xử lý hình ảnh tốt hơn.


Từ những gì tôi có thể hiểu DFT ngụ ý mở rộng định kỳ trong khi DCT ngụ ý thậm chí mở rộng. Khi thực hiện nén hình ảnh, người ta đang làm việc trên các khối nhỏ của hình ảnh. Vì phần mở rộng định kỳ được ngụ ý bởi DFT gây ra các bước nhảy tại biên giới, do đó làm giảm tốc độ hội tụ; tốt hơn là sử dụng DCT để nén hình ảnh (hội tụ nhanh hơn-> các tệp nhỏ hơn với cùng một lượng thông tin hiển thị). Tuy nhiên DCT dường như được đề cập chủ yếu trong bối cảnh này. Bối cảnh tôi đang làm việc là tôi muốn lọc một hình ảnh bằng bộ lọc Gabor. Điều này có thể được thực hiện bằng cách sử dụng DCT?
Andy

Nếu bạn chỉ muốn lọc hình ảnh bằng bộ lọc Gabor, bạn chỉ nên sử dụng FFT. Các điều kiện biên sẽ không phải là một vấn đề. Tại sao bạn lo lắng về các điều kiện biên, hoặc có phổ hoàn toàn thực, để lọc bằng bộ lọc Gabor?
schnarf

Về việc có phổ hoàn toàn thực: Tôi cần ước tính tần số chi phối: fu = Sum (u * G) / Sum (G) và fv, trong đó G (u, v) là FFT của hình ảnh của tôi g (x, y) . Tôi không hiểu làm thế nào điều này hoạt động nếu G là phức tạp. Tôi sẽ nhận được một fu phức tạp?
Andy

Thay vì xem xét các giá trị phức tạp, bạn nên xem xét độ lớn của chúng. Tức là với mỗi tần số phức z = a + bi, cường độ của nó là sqrt (a ^ 2 + b ^ 2).
schnarf

Một điều khác để suy nghĩ: Có vẻ khó hiểu khi bạn lấy dữ liệu thực và nhận được một phổ phức tạp. Phổ phức chỉ là một cách cho mỗi hình sin một pha cụ thể.
schnarf
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.