Hướng dẫn fourier transform image python - trăn hình ảnh biến đổi fourier

Các đơn vị riêng lẻ tạo nên một hình ảnh là gì? Chắc chắn, một câu trả lời là pixel, mỗi pixel có một giá trị nhất định. Một điều đáng ngạc nhiên khác là các hàm sin với các tham số khác nhau. Trong bài viết này, tôi sẽ thuyết phục bạn rằng bất kỳ hình ảnh hai chiều (2D) nào cũng có thể được xây dựng lại chỉ bằng các hàm sin và không có gì khác. Tôi sẽ hướng dẫn bạn thông qua mã bạn có thể viết để đạt được điều này bằng cách sử dụng biến đổi Fourier 2D trong Pythonany two-dimensional (2D) image can be reconstructed using only sine functions and nothing else. I’ll guide you through the code you can write to achieve this using the 2D Fourier transform in Python

Show

Tôi sẽ nói về Fourier Transforms. Tuy nhiên, bạn không cần phải làm quen với lý thuyết toán học hấp dẫn này. Tôi sẽ mô tả các bit bạn cần biết trên đường đi. Đây sẽ không phải là một hướng dẫn kỹ thuật chi tiết về biến đổi Fourier, mặc dù nếu bạn ở đây để tìm hiểu về Fourier Transforms và Fourier tổng hợp, thì bạn sẽ thấy bài đăng này hữu ích để đọc cùng với nhiều văn bản kỹ thuật hơn.

Phác thảo của bài viết này

Cách tốt nhất để đọc bài viết này là từ trên xuống dưới. Nhưng nếu bạn muốn nhảy qua các phần, thì đây là một phác thảo của bài viết:

  • Giới thiệu: Mọi hình ảnh chỉ được tạo thành từ các chức năng sin
  • Các cách tử hình sin là gì?
  • Tạo ra các cách tử hình sin bằng cách sử dụng Numpy trong Python
  • Biến đổi Fourier
  • Tính toán biến đổi Fourier 2D của hình ảnh trong Python
  • Kỹ thuật đảo ngược dữ liệu biến đổi Fourier
  • Biến đổi Fourier nghịch đảo
  • Tìm tất cả các cặp điểm trong biến đổi Fourier 2D
  • Sử dụng biến đổi Fourier 2D trong Python để xây dựng lại hình ảnh
  • Sự kết luận

Ai là bài viết này cho?

  • Bất cứ ai muốn khám phá bằng cách sử dụng hình ảnh trong Python

  • Bất cứ ai muốn hiểu các biến đổi 2D Fourier và sử dụng FFT trong Python

  • Những người quan tâm đến quang học và khoa học về hình ảnh

  • Bất cứ ai có quan tâm đến xử lý hình ảnh

  • Những người có hứng thú với các dự án Python mới, đặc biệt là những người sử dụng Numpy


Mỗi hình ảnh chỉ được tạo thành từ các hàm sin

Hãy để tôi bắt đầu bằng cách chỉ cho bạn kết quả cuối cùng của bài viết này. Hãy để một hình ảnh như hình ảnh này cho thấy Tháp Elizabeth mang tính biểu tượng của London, thường được gọi là Big Ben. Big Ben là tên của tiếng chuông bên trong tòa tháp, chứ không phải của chính tòa tháp, nhưng tôi lạc đề:

Hướng dẫn fourier transform image python - trăn hình ảnh biến đổi fourier

Hình ảnh này có thể được xây dựng lại từ một loạt các cách tử hình sin. Một cách tử hình sin trông như thế này:

Hướng dẫn fourier transform image python - trăn hình ảnh biến đổi fourier

Nó gọi là một cách tử hình sin vì các giá trị thang độ xám thay đổi tùy theo hàm sin. Nếu bạn vẽ đồ thị các giá trị dọc theo một đường ngang của cách tử, bạn sẽ nhận được một âm mưu của một hàm sin:

Hướng dẫn fourier transform image python - trăn hình ảnh biến đổi fourier

Và ở đây, việc tái thiết hình ảnh Tháp Elizabeth từ hàng ngàn cách tử hình sin khác nhau:

Vidoes cho thấy cách tử hình sin và tái thiết hình ảnh

Trong video trên và tất cả các video tương tự khác trong bài viết này:

  • Hình ảnh bên trái cho thấy các cách tử hình sin riêng lẻ
  • Hình ảnh bên phải cho thấy tổng của tất cả các cách tử hình sin

Do đó, mỗi cách tử hình sin mà bạn nhìn thấy ở bên trái được thêm vào tất cả các hình ảnh được hiển thị trước đây trong video và kết quả bất cứ lúc nào là hình ảnh bên phải. Ngay từ đầu trong video, hình ảnh bên phải là không thể nhận ra. Tuy nhiên, chẳng mấy chốc, bạn sẽ bắt đầu thấy các hình dạng chính từ hình ảnh gốc xuất hiện. Khi video tiếp tục, ngày càng nhiều chi tiết được thêm vào hình ảnh. Ở cuối video, kết quả là một hình ảnh giống hệt với hình ảnh gốc.

Video hiển thị ở trên được tăng tốc, và không phải tất cả các khung được hiển thị. Hình ảnh cuối cùng có hơn 90.000 cách tử hình sin riêng lẻ được cộng lại với nhau. Trong bài viết này, bạn sẽ sử dụng biến đổi 2D Fourier trong Python để viết mã sẽ tạo ra các cách tử hình sin này cho một hình ảnh và bạn sẽ có thể tạo một hình ảnh động tương tự cho bất kỳ hình ảnh nào bạn chọn.

Các cách tử hình sin là gì?

Hàm sin vẽ một sóng. Làn sóng được mô tả bởi hàm sin có thể được coi là một làn sóng thuần túy, và nó có tầm quan trọng rất lớn trong tất cả các vật lý, và do đó, trong tự nhiên.

Nếu bạn đã quen thuộc với sóng, bạn có thể bỏ qua một vài dòng tiếp theo và đi thẳng vào cuộc thảo luận về cách tử hình sin.

Khi xử lý sóng, thay vì chỉ sử dụng:

Bạn thường sẽ sử dụng phiên bản sau:

y = \sin\left(\frac{2\pi x}{\lambda}\right)

Thuật ngữ trong ngoặc đại diện cho một góc và là một góc được đo bằng radian, tương đương với 360 độ. Độ và radian là hai cách đo góc theo cùng một cách mét và bàn chân đều là đơn vị khoảng cách. is an angle measured in radians, equivalent to 360º. Degrees and radians are two ways of measuring angles in the same way metres and feet are both units of distance.

Thuật ngữ (lambda) đề cập đến bước sóng của sóng. Bước sóng cung cấp cho bạn khoảng cách giữa một đỉnh và độ sóng tiếp theo. Bất cứ khi nào bằng một số tổng số của bước sóng, sóng hình sin sẽ bắt đầu lại và sẽ có cùng giá trị như khi nào. (lambda) refers to the wavelength of the wave. The wavelength gives you the distance between one peak and the next of the wave. Whenever is equal to a whole number multiple of the wavelength, the sine wave will start again and will have the same value as when .

Sóng có thể được biểu diễn tốt hơn bằng cách:

y=A\sin\left(\frac{2\pi x}{\lambda}+\phi\right)

là biên độ của sóng, xác định sóng cao và thấp. Thuật ngữ (PHI) là pha và xác định mức độ sóng được dịch chuyển sang một bên. Bạn sẽ thấy những thuật ngữ này có nghĩa là gì về các cách tử hình sin trong phần tiếp theo. (phi) is the phase and determines how much the wave is shifted sideways. You’ll see what these terms mean in terms of sinusoidal gratings in the next section.

Tử hình hình sin

Một cách tử hình sin là một biểu diễn hai chiều trong đó biên độ thay đổi theo một hướng nhất định. Tất cả các ví dụ dưới đây là các cách tử hình sin có một định hướng khác nhau:orientation:

Hướng dẫn fourier transform image python - trăn hình ảnh biến đổi fourier

Có những thông số khác xác định một cách tử hình sin. Bạn đã thấy những thứ này trong phương trình của sóng hiển thị ở trên. Biên độ của cách tử hình sin, còn được gọi là độ tương phản, xác định sự khác biệt về giá trị thang độ xám giữa các điểm tối đa và tối thiểu của cách tử. Dưới đây là một vài cách tử với biên độ hoặc độ tương phản khác nhau:amplitude of a sinusoidal grating, also referred to as contrast, determines the difference in grayscale values between the maximum and minimum points of a grating. Here are a few gratings with different amplitudes or contrasts:

Hướng dẫn fourier transform image python - trăn hình ảnh biến đổi fourier

Trong cách tử với biên độ cao nhất, đỉnh của cách tử là màu trắng và máng có màu đen. Khi biên độ thấp hơn, đỉnh và máng là mức độ màu xám. Nếu biên độ bằng không, như trong ví dụ cuối cùng được hiển thị ở trên, thì không có sự khác biệt giữa đỉnh và máng. Toàn bộ hình ảnh có cùng mức màu xám. Trong trường hợp này, độ tương phản bằng không và không còn điều chế hình sin.

Tham số tiếp theo ảnh hưởng đến cách tử là bước sóng hoặc tần số. Chiều dài của sóng càng ngắn, càng nhiều sóng phù hợp trong cùng một vùng của không gian, và do đó tần số của sóng cao hơn. Điều này thường được gọi là tần số không gian. Dưới đây là các ví dụ về cách tử hình sin với các bước sóng hoặc tần số khác nhau:wavelength or frequency. The shorter the length of the wave, the more waves fit in the same region of space, and therefore the frequency of the wave is higher. This is often referred to as spatial frequency. Below are examples of sinusoidal gratings with different wavelengths or frequencies:

Hướng dẫn fourier transform image python - trăn hình ảnh biến đổi fourier

Từ trái sang phải, bước sóng đang giảm và tần số đang tăng lên.

Tham số cuối cùng là pha của cách tử. Hai cách tử có thể có cùng tần số, biên độ và định hướng, nhưng không phải là cùng một điểm bắt đầu. Các cách tử được thay đổi theo sự tôn trọng với nhau. Dưới đây là một số ví dụ về cách tử hình sin với một giai đoạn khác:phase of the grating. Two gratings can have the same frequency, amplitude and orientation, but not the same starting point. The gratings are shifted with respect to each other. Here are some examples of sinusoidal gratings with a different phase:

Hướng dẫn fourier transform image python - trăn hình ảnh biến đổi fourier

Tóm lại, các tham số mô tả cách tử hình sin là:

  • bước sóng hoặc tần số
  • biên độ
  • định hướng
  • giai đoạn

Tạo ra các cách tử hình sin bằng cách sử dụng Numpy trong Python

Trước khi tôi chuyển sang nói về các biến đổi 2D Fourier trong Python, hãy để Lôi tạo ra một số cách tử hình sin và xem làm thế nào bạn có thể thay đổi các thông số mà tôi đã mô tả. Bạn đã giành chiến thắng để tạo ra các cách tử hình sin trực tiếp trong phần còn lại của bài viết này để giải mã và sau đó xây dựng lại một hình ảnh bằng cách sử dụng biến đổi 2D Fourier. Do đó, bạn có thể bỏ qua phần này nếu bạn thích nhảy thẳng vào Fourier Transforms và Fourier tổng hợp. Nhưng nếu bạn không vội vàng, phần này sẽ cung cấp cái nhìn sâu sắc hơn về các cách tử và cách tạo ra chúng trong Python.

Trong bài viết này, tôi sẽ sử dụng Numpy cho tất cả các hoạt động định lượng và matplotlib để trực quan hóa. Bạn cần phải cài đặt các gói này nếu bạn đã thực hiện như vậy.

Hãy để tạo ra một sóng hình sin 1D trước khi bạn chuyển sang phiên bản 2D. Kịch bản đầu tiên mà bạn sẽ làm việc được gọi là

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

wavelength = 200
y = np.sin(2 * np.pi * x / wavelength)

plt.plot(x, y)
plt.show()
2:

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

wavelength = 200
y = np.sin(2 * np.pi * x / wavelength)

plt.plot(x, y)
plt.show()

Trước tiên, bạn tạo một mảng để biểu diễn trục X bằng

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

wavelength = 200
y = np.sin(2 * np.pi * x / wavelength)

plt.plot(x, y)
plt.show()
3. Bạn có thể tạo ra một mảng từ
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

wavelength = 200
y = np.sin(2 * np.pi * x / wavelength)

plt.plot(x, y)
plt.show()
4 đến
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

wavelength = 200
y = np.sin(2 * np.pi * x / wavelength)

plt.plot(x, y)
plt.show()
5 với các bước
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

wavelength = 200
y = np.sin(2 * np.pi * x / wavelength)

plt.plot(x, y)
plt.show()
6. Điểm cuối không được bao gồm khi sử dụng
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

wavelength = 200
y = np.sin(2 * np.pi * x / wavelength)

plt.plot(x, y)
plt.show()
3, đó là lý do tại sao
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

wavelength = 200
y = np.sin(2 * np.pi * x / wavelength)

plt.plot(x, y)
plt.show()
8 được sử dụng làm đối số thứ hai. Mảng này có các yếu tố
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

wavelength = 200
y = np.sin(2 * np.pi * x / wavelength)

plt.plot(x, y)
plt.show()
9. Có một lý do tại sao tôi đã chọn một số lượng các yếu tố kỳ lạ trong mảng. Tôi sẽ trở lại với điều này sau.

Sau đó, bạn xác định y bằng cách sử dụng các phương trình đơn giản hơn tôi đã thảo luận trước đó. Bước sóng là

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
grating = np.sin(2 * np.pi * X / wavelength)

plt.set_cmap("gray")
plt.imshow(grating)
plt.show()
0, có nghĩa là mỗi sóng sẽ dài
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
grating = np.sin(2 * np.pi * X / wavelength)

plt.set_cmap("gray")
plt.imshow(grating)
plt.show()
0. Điều này cung cấp một sóng hình sin khi bạn vẽ nó bằng cách sử dụng
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
grating = np.sin(2 * np.pi * X / wavelength)

plt.set_cmap("gray")
plt.imshow(grating)
plt.show()
2. Nếu bạn sử dụng một môi trường tương tác, bạn sẽ thắng được sử dụng cuộc gọi rõ ràng đến
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
grating = np.sin(2 * np.pi * X / wavelength)

plt.set_cmap("gray")
plt.imshow(grating)
plt.show()
3. Tuy nhiên, tất cả các ví dụ trong bài viết này đều dựa trên việc viết một tập lệnh, vì vậy tôi sẽ bao gồm các cuộc gọi đến
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
grating = np.sin(2 * np.pi * X / wavelength)

plt.set_cmap("gray")
plt.imshow(grating)
plt.show()
3 khi được yêu cầu:

Hướng dẫn fourier transform image python - trăn hình ảnh biến đổi fourier

Có năm sóng hiện diện. Đây là những gì bạn mong đợi vì bước sóng là

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
grating = np.sin(2 * np.pi * X / wavelength)

plt.set_cmap("gray")
plt.imshow(grating)
plt.show()
0 đơn vị và có
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

wavelength = 200
y = np.sin(2 * np.pi * x / wavelength)

plt.plot(x, y)
plt.show()
9 điểm trong mảng.

Chuyển từ sin 1D sang cách tử hình sin 2D

Để dịch nó thành cách tử 2D, bạn sẽ cần sử dụng

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
grating = np.sin(2 * np.pi * X / wavelength)

plt.set_cmap("gray")
plt.imshow(grating)
plt.show()
7:

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
grating = np.sin(2 * np.pi * X / wavelength)

plt.set_cmap("gray")
plt.imshow(grating)
plt.show()

Numpy từ

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
grating = np.sin(2 * np.pi * X / wavelength)

plt.set_cmap("gray")
plt.imshow(grating)
plt.show()
7 tạo ra một biểu diễn 2D có thể được sử dụng làm cơ sở cho các phương trình 2D. Tôi đã sử dụng vốn
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
grating = np.sin(2 * np.pi * X / wavelength)

plt.set_cmap("gray")
plt.imshow(grating)
plt.show()
9 và
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
angle = np.pi / 9
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")
plt.imshow(grating)
plt.show()
0 để đại diện cho các phiên bản 2D.

Bạn có thể đọc thêm về

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
angle = np.pi / 9
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")
plt.imshow(grating)
plt.show()
1, bao gồm các lựa chọn thay thế có thể hiệu quả hơn, trong bài viết numpy.meshgrid (): Nó hoạt động như thế nào? Khi nào bạn cần nó? Có lựa chọn thay thế tốt hơn không?

Bạn thay đổi bản đồ màu thành thang độ xám trước khi hiển thị hình ảnh bằng

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
angle = np.pi / 9
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")
plt.imshow(grating)
plt.show()
2. Điều này mang lại cho cách tử hình sin sau:

Hướng dẫn fourier transform image python - trăn hình ảnh biến đổi fourier

Bạn có thể thay đổi giá trị của biến

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
angle = np.pi / 9
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")
plt.imshow(grating)
plt.show()
3 để xem điều này ảnh hưởng đến cách tử được hiển thị như thế nào. Bạn cũng có thể thay thế
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
grating = np.sin(2 * np.pi * X / wavelength)

plt.set_cmap("gray")
plt.imshow(grating)
plt.show()
9 bằng
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
angle = np.pi / 9
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")
plt.imshow(grating)
plt.show()
0 để có được một cách cư xử theo chiều dọc.

Nếu bạn muốn tạo một cách tử với bất kỳ định hướng nào khác, bạn sẽ cần phải chuyển đổi các trục để tính toán để xoay vòng, ví dụ:

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
angle = np.pi / 9
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")
plt.imshow(grating)
plt.show()

Bạn đã áp dụng phép quay của các trục biến đổi bằng cách sử dụng và bạn xoay vòng cách của radian, tương đương với 20 độ. Điều này mang lại một cách tử với cùng tần số nhưng được định hướng dọc theo một góc độ khác: and you rotated the grating by radians, which is equivalent to 20º. This gives a grating with the same frequency but oriented along a different angle:

Hướng dẫn fourier transform image python - trăn hình ảnh biến đổi fourier

Như đã đề cập ở trên, bạn đã giành chiến thắng để tạo ra thủ công bất kỳ cách tử hình sin nào để giải mã và sau đó xây dựng lại hình ảnh bằng cách sử dụng các biến đổi 2D Fourier trong Python. Bạn đã thấy cách thay đổi tần số và định hướng của các cách tử. Tôi sẽ để nó như một bài tập để bạn thử nghiệm với biên độ và pha nếu bạn muốn.

Bây giờ, nó thời gian cho ngôi sao của chương trình. Như tôi đã đề cập khi bắt đầu, đây không phải là một hướng dẫn chi tiết về Fourier Transforms, vì vậy tôi đã giành chiến thắng trong việc đi sâu vào toán học của lý thuyết Fourier. Thay vào đó, tôi sẽ tập trung vào một sự hiểu biết chung về những gì chúng là và cách chúng liên quan đến hình ảnh.

Tôi sẽ đảo ngược mô hình thông thường của việc giới thiệu một khái niệm mới và trước tiên chỉ cho bạn cách tính toán biến đổi 2D Fourier trong Python và sau đó giải thích nó là gì sau đó.

Sử dụng các chức năng biến đổi Fourier 2D của Numpy

Hãy để Lôi lấy hai cách tử hình sin mà bạn đã tạo ra và tìm ra biến đổi Fourier của họ bằng cách sử dụng Python, Numpy. Đầu tiên, bạn có thể quay lại một định hướng dọc theo trục ngang bằng cách đặt

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
angle = np.pi / 9
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")
plt.imshow(grating)
plt.show()
6:

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
angle = 0
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()

Bạn sử dụng matplotlib từ

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
angle = np.pi / 9
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")
plt.imshow(grating)
plt.show()
7 để tạo hai lô trong cùng một hình. Hàm tính toán biến đổi Fourier 2D trong Python là
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
angle = np.pi / 9
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")
plt.imshow(grating)
plt.show()
8. FFT là viết tắt của biến đổi Fourier nhanh và là một thuật toán tiêu chuẩn được sử dụng để tính toán biến đổi Fourier về mặt tính toán. Có những mô -đun khác cung cấp chức năng tương tự, nhưng tôi sẽ tập trung vào Numpy trong bài viết này.

Các dòng ngay trước và sau cuộc gọi

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
angle = np.pi / 9
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")
plt.imshow(grating)
plt.show()
8 rất quan trọng, nhưng bạn có thể hiểu những gì xảy ra mà không cần xem xét hai dòng này. Do đó, tôi sẽ thảo luận về chúng trong một phụ lục cho những người quan tâm và muốn đi sâu hơn với biến đổi 2D Fourier trong Python.

Kết quả của FFT là một mảng các số phức. Đây là lý do tại sao bạn vẽ giá trị tuyệt đối của biến đổi Fourier

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
angle = 0
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
0, sử dụng hàm tích hợp
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
angle = 0
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
1. Lưu ý rằng bạn chỉ làm điều này cho các mục đích hiển thị biến đổi Fourier. Bạn không loại bỏ thông tin phức tạp từ mảng
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
angle = 0
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
0. Bạn cũng phóng to vào phần trung tâm của hình ảnh bằng cách sử dụng
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
angle = 0
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
3 và
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
angle = 0
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
4 vì đó là nơi mà tất cả các hành động. Lưu ý rằng các giới hạn trên trục y bị đảo ngược. Điều này là do cách matplotlib liên quan đến việc hiển thị hình ảnh và trục.

Hiểu được biến đổi Fourier

Đầu ra từ mã trên là hình ảnh sau:

Hướng dẫn fourier transform image python - trăn hình ảnh biến đổi fourier

Các cách tử hình sin bên trái là thứ mà bạn đã thấy trước đó. Bên phải là biểu diễn trực quan của biến đổi Fourier của cách tử này. Nó cho thấy giá trị

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
angle = 0
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
5 ở khắp mọi nơi ngoại trừ hai điểm. Hãy nhớ lại rằng mảng có kích thước
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
angle = 0
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
6, và do đó, trung tâm của mảng là
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
angle = 0
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
7. Các dấu chấm đang ở tọa độ
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
angle = 0
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
8 và
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
angle = 0
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
9. Họ là mỗi năm pixel cách trung tâm. Bạn có thể thấy rằng họ luôn luôn đối xứng xung quanh điểm trung tâm.

Sự đối xứng này là lý do tôi chọn làm cho kích thước mảng trở nên kỳ lạ. Một mảng có kích thước lẻ có một pixel duy nhất đại diện cho trung tâm, trong khi khi kích thước chẵn, trung tâm được "chia sẻ" trong số bốn pixel:

Hướng dẫn fourier transform image python - trăn hình ảnh biến đổi fourier
Một mảng vuông có chiều dài lẻ có một pixel duy nhất đại diện cho tâm. Nếu độ dài là một số chẵn, không có pixel trung tâm duy nhất

Hãy cùng xem những gì xảy ra nếu bạn tăng gấp đôi tần số của cách tử hình sin. Để tăng gấp đôi tần số, bạn một nửa bước sóng:

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 100
angle = 0
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()

Đầu ra từ mã này là tập hợp các sơ đồ sau:

Hướng dẫn fourier transform image python - trăn hình ảnh biến đổi fourier

Mỗi một trong hai chấm bây giờ cách trung tâm mười pixel. Do đó, khi bạn tăng gấp đôi tần số của cách tử hình sin, hai chấm trong biến đổi Fourier di chuyển ra xa khỏi trung tâm.

Cặp chấm trong biến đổi Fourier đại diện cho cách tử hình sin. Các chấm luôn luôn có các cặp đối xứng trong biến đổi Fourier.. Dots always come in symmetrical pairs in the Fourier transform.

Hãy để xoay vòng cách tử hình sin này trong 20 độ, như bạn đã làm trước đó. Đó là radians: radians:

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 100
angle = np.pi/9
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()

Điều này cung cấp cho tập hợp cách tử hình sin sau đây và biến đổi Fourier:

Hướng dẫn fourier transform image python - trăn hình ảnh biến đổi fourier

Các dấu chấm không phải là chấm hoàn hảo trong trường hợp này. Điều này là do các hạn chế tính toán và lấy mẫu, nhưng nó không liên quan đến cuộc thảo luận này, vì vậy tôi sẽ bỏ qua nó ở đây. Bạn có thể đọc thêm về lấy mẫu và đệm khi sử dụng FFT nếu bạn muốn đi sâu vào chi tiết hơn.

Biến đổi Fourier và các thông số cách tử

Bạn có thể thấy rằng khoảng cách của các chấm này từ trung tâm giống như trong ví dụ trước. Khoảng cách của các chấm từ trung tâm biểu thị tần số của cách tử hình sin. Các chấm càng nhiều là từ trung tâm, tần số chúng đại diện càng cao.distance of the dots from the centre represents the frequency of the sinusoidal grating. The further the dots are from the centre, the higher the frequency they represent.

Định hướng của các chấm đại diện cho định hướng của cách tử. Bạn có thể thấy rằng đường nối kết nối các chấm với trung tâm tạo ra một góc 20 độ với ngang, giống như góc của cách tử.orientation of the dots represents the orientation of the grating. You’ll find that the line connecting the dots to the centre makes an angle of 20º with the horizontal, same as the angle of the grating.

Các tham số cách tử khác cũng được thể hiện trong biến đổi Fourier. Giá trị của các pixel tạo thành các chấm trong biến đổi Fourier đại diện cho biên độ của cách tử. Thông tin về pha cũng được mã hóa trong mảng biến đổi Fourier phức tạp, quá. Tuy nhiên, bạn có thể hiển thị giá trị tuyệt đối của biến đổi Fourier. Do đó, hình ảnh bạn hiển thị không hiển thị pha, nhưng thông tin vẫn còn đó trong mảng biến đổi Fourier trước khi bạn lấy giá trị tuyệt đối.value of the pixels making up the dots in the Fourier transform represents the amplitude of the grating. Information about the phase is encoded in the complex Fourier transform array, too. However, you’re displaying the absolute value of the Fourier transform. Therefore, the image you display doesn’t show the phase, but the information is still there in the Fourier transform array before you take the absolute value.

Do đó, biến đổi Fourier tạo ra biên độ, tần số, định hướng và pha của cách tử hình sin.

Thêm nhiều hơn một cách tử

Hãy để thêm hai cách tử hình sin với nhau và xem điều gì sẽ xảy ra. Bạn thêm hai cách tử với các tần số và hướng khác nhau:

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength_1 = 200
angle_1 = 0
grating_1 = np.sin(
    2*np.pi*(X*np.cos(angle_1) + Y*np.sin(angle_1)) / wavelength_1
)
wavelength_2 = 100
angle_2 = np.pi/4
grating_2 = np.sin(
    2*np.pi*(X*np.cos(angle_2) + Y*np.sin(angle_2)) / wavelength_2
)

plt.set_cmap("gray")
plt.subplot(121)
plt.imshow(grating_1)
plt.subplot(122)
plt.imshow(grating_2)
plt.show()

gratings = grating_1 + grating_2

# Calculate Fourier transform of the sum of the two gratings
ft = np.fft.ifftshift(gratings)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.figure()
plt.subplot(121)
plt.imshow(gratings)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()

Con số đầu tiên bạn nhận được với cuộc gọi đầu tiên của

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
grating = np.sin(2 * np.pi * X / wavelength)

plt.set_cmap("gray")
plt.imshow(grating)
plt.show()
3 hiển thị hai cách tử hình sin riêng biệt:

Hướng dẫn fourier transform image python - trăn hình ảnh biến đổi fourier

Lưu ý rằng nếu bạn đang chạy điều này trong một tập lệnh và không phải trong môi trường tương tác, việc thực thi chương trình sẽ tạm dừng khi bạn gọi

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
grating = np.sin(2 * np.pi * X / wavelength)

plt.set_cmap("gray")
plt.imshow(grating)
plt.show()
3 và sẽ tiếp tục khi bạn đóng cửa sổ hình.

Sau đó, bạn thêm

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 100
angle = 0
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
2 vào
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 100
angle = 0
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
3 và bạn tính toán biến đổi Fourier của mảng mới này có hai cách tử chồng lên nhau. Hình thứ hai được hiển thị bởi mã này cho thấy các cách tử kết hợp ở bên trái và biến đổi Fourier của mảng này ở bên phải:

Hướng dẫn fourier transform image python - trăn hình ảnh biến đổi fourier

Mặc dù bạn không thể dễ dàng phân biệt hai cách tử hình sin với hình ảnh kết hợp, biến đổi Fourier vẫn cho thấy hai thành phần rõ ràng. Có hai cặp chấm đại diện cho hai cách tử hình sin. Một cặp cho thấy một cách tử hướng dọc theo ngang. Thứ hai cho thấy một cách tử với định hướng 45 độ và tần số cao hơn vì các chấm nằm xa trung tâm.

Thêm nhiều cách tử hình sin

Hãy để Lôi đi thêm một bước nữa và thêm nhiều cách tử hình sin:

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

amplitudes = 0.5, 0.25, 1, 0.75, 1
wavelengths = 200, 100, 250, 300, 60
angles = 0, np.pi / 4, np.pi / 9, np.pi / 2, np.pi / 12

gratings = np.zeros(X.shape)
for amp, w_len, angle in zip(amplitudes, wavelengths, angles):
    gratings += amp * np.sin(
        2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / w_len
    )

# Calculate Fourier transform of the sum of the gratings
ft = np.fft.ifftshift(gratings)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.set_cmap("gray")
plt.subplot(121)
plt.imshow(gratings)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()

Bây giờ bạn cũng đã thêm tham số biên độ. Các biên độ, bước sóng và góc hiện được định nghĩa là bộ dữ liệu. Bạn lặp qua các giá trị này bằng hàm

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 100
angle = 0
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
4. Mảng
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 100
angle = 0
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
5 cần được khởi tạo dưới dạng một mảng số không trước khi lặp. Bạn xác định mảng này có hình dạng giống như
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 200
grating = np.sin(2 * np.pi * X / wavelength)

plt.set_cmap("gray")
plt.imshow(grating)
plt.show()
9.

Đầu ra của mã này là hình sau:

Hướng dẫn fourier transform image python - trăn hình ảnh biến đổi fourier

Hình ảnh bên trái cho thấy tất cả năm cách tử chồng lên nhau. Biến đổi Fourier ở bên phải cho thấy các thuật ngữ riêng lẻ như các cặp chấm. Biên độ của các chấm đại diện cho biên độ của các cách tử, quá.

Bạn cũng có thể thêm một thuật ngữ không đổi vào hình ảnh cuối cùng. Đây là cường độ nền của một hình ảnh và tương đương với một cách tử với tần số bằng không. Bạn có thể thêm điều này chỉ bằng cách thêm một hằng số vào hình ảnh:

y=A\sin\left(\frac{2\pi x}{\lambda}+\phi\right)
0

Biến đổi Fourier cho thấy điều này như một dấu chấm ở trung tâm của biến đổi:

Hướng dẫn fourier transform image python - trăn hình ảnh biến đổi fourier

Đây là dấu chấm duy nhất không thuộc về một cặp. Trung tâm của biến đổi Fourier đại diện cho nền không đổi của hình ảnh.

Tính toán biến đổi Fourier 2D của hình ảnh trong Python

Những gì liên kết giữa hình ảnh và các cách tử hình sin này? Nhìn lại hình cho thấy mảng với năm cách tử được thêm vào với nhau. Bây giờ tôi sẽ tuyên bố rằng đây là "một hình ảnh". Một hình ảnh, sau tất cả, là một mảng các pixel mà mỗi pixel có một giá trị nhất định. Nếu chúng ta giới hạn bản thân ở hình ảnh thang độ xám, thì mỗi pixel trong một hình ảnh là một giá trị đại diện cho mức màu xám của pixel đó. Đặt các pixel này cạnh nhau và chúng tiết lộ một hình ảnh.

Bây giờ, tổng của năm cách tử không giống như bất cứ điều gì thú vị. Vì vậy, hãy để Lôi nhìn vào một hình ảnh thực, thay vào đó: thay vào đó:

Hướng dẫn fourier transform image python - trăn hình ảnh biến đổi fourier

Bạn có thể tải xuống hình ảnh của Trái đất này, được gọi là

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 100
angle = 0
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
7 từ kho lưu trữ được liên kết với bài viết này:

  • Liên kết đến kho lưu trữ github hoặc

  • Tải xuống trực tiếp các tệp

Ngoài ra còn có những hình ảnh khác mà bạn sẽ sử dụng sau này. Bạn cần phải đặt tệp hình ảnh này trong thư mục dự án của mình.

Đọc hình ảnh và chuyển đổi sang thang độ xám

Để giữ cho mọi thứ đơn giản hơn một chút, tôi sẽ làm việc ở mức độ xám để hình ảnh là một mảng 2D. Hình ảnh màu là mảng 3D hoặc 4D. Một số định dạng hình ảnh màu là mảng 3D vì chúng có một lớp cho màu đỏ, một cho màu xanh lá cây và một cho màu xanh lam. Một số định dạng hình ảnh cũng có giá trị alpha là lớp thứ tư. Bằng cách chuyển đổi hình ảnh màu thành thang độ xám, bạn có thể giảm chúng thành một mảng 2D.

Bạn sẽ làm việc trên một tập lệnh mới có tên

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 100
angle = 0
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
8:

y=A\sin\left(\frac{2\pi x}{\lambda}+\phi\right)
1

Bạn sử dụng matplotlib từ

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 100
angle = 0
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
9 để đọc hình ảnh thành một mảng numpy. Mặc dù có những cách tốt hơn để chuyển đổi hình ảnh màu thành thang độ xám, phương pháp thô để tính trung bình các kênh màu đỏ, xanh lá cây và xanh của hình ảnh là đủ tốt cho mục đích của bài viết này. Bạn có thể loại bỏ thông tin trong kênh Alpha thứ tư, nếu có. Điều này mang lại biểu diễn thang độ xám của hình ảnh gốc:

Hướng dẫn fourier transform image python - trăn hình ảnh biến đổi fourier

Bản in của

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 100
angle = np.pi/9
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
0 cho thấy đây là hình ảnh pixel
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 100
angle = np.pi/9
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
1. Nó đã được vuông và lẻ, giúp dễ dàng giải quyết hơn. Bạn sẽ thấy sau làm thế nào bạn có thể đối phó với hình ảnh chung hơn.

Tính toán biến đổi Fourier 2D của hình ảnh

Bạn có thể thực hiện biến đổi 2D Fourier theo cách tương tự như bạn đã làm trước đó với các cách tử hình sin. Khi bạn thường xuyên làm việc với FFT, bạn có thể tạo một chức năng để chuyển đổi một hình ảnh thành biến đổi Fourier của nó:

y=A\sin\left(\frac{2\pi x}{\lambda}+\phi\right)
2

Bạn tính toán biến đổi Fourier 2D và hiển thị cặp hình ảnh: hình ảnh đất thang độ xám và biến đổi của nó. Bạn hiển thị logarit của biến đổi Fourier bằng cách sử dụng

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 100
angle = np.pi/9
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
2 vì điều này cho phép bạn xem những gì diễn ra tốt hơn. Nếu không có sự thay đổi này, thuật ngữ không đổi ở trung tâm của biến đổi Fourier sẽ sáng hơn nhiều so với tất cả các điểm khác mà mọi thứ khác sẽ xuất hiện màu đen. Bạn có thể bị "mù" bởi cái này, Central Dot.

Đầu ra hiển thị các ô sau:

Hướng dẫn fourier transform image python - trăn hình ảnh biến đổi fourier

Bây giờ có rất nhiều dấu chấm có giá trị khác không trong biến đổi Fourier. Thay vì năm cặp chấm đại diện cho năm cách tử hình sin, giờ đây bạn có hàng ngàn cặp chấm. Điều này có nghĩa là có hàng ngàn cách tử hình sin có trong hình ảnh trái đất. Mỗi cặp chấm đại diện cho một cách tử hình sin với tần số, biên độ, hướng và pha cụ thể. Càng xa các chấm là từ trung tâm, tần số càng cao. Chúng càng sáng, thì cách tử càng nổi bật trong hình ảnh vì nó có biên độ cao hơn. Và định hướng của từng cặp chấm liên quan đến trung tâm thể hiện định hướng của các cách tử. Pha cũng được mã hóa trong biến đổi Fourier.

Kỹ thuật đảo ngược dữ liệu biến đổi Fourier

Chúng ta biết gì cho đến nay? Thuật toán FFT trong Python, Numpy có thể tính toán biến đổi 2D Fourier của hình ảnh. Điều này phân hủy hình ảnh thành hàng ngàn thành phần. Mỗi thành phần là một cách tử hình sin.

Nếu bạn thực hiện bất kỳ cặp chấm phù hợp nào trong biến đổi Fourier, bạn có thể trích xuất tất cả các tham số bạn cần để tạo lại cách tử hình sin. Và nếu bạn làm điều đó cho mỗi cặp chấm trong biến đổi Fourier, bạn sẽ kết thúc với toàn bộ các cách tử tạo nên hình ảnh.

Chẳng mấy chốc, bạn sẽ thấy mã bạn có thể sử dụng để đi qua từng cặp điểm trong biến đổi Fourier. Trước đó, tôi cần thêm một thuộc tính của biến đổi Fourier sẽ làm cho mọi thứ đơn giản hơn một chút.

Biến đổi Fourier nghịch đảo

Bạn đang hiển thị biến đổi Fourier như một bộ sưu tập các pixel. Nó thỏa mãn định nghĩa của một "hình ảnh". Vì vậy, điều gì sẽ xảy ra nếu bạn phải tìm ra biến đổi Fourier của chính biến đổi Fourier? Bạn kết thúc với hình ảnh gốc!

Có một vài kỹ thuật mà tôi sẽ bỏ qua ở đây. Vì lý do này, chúng tôi sử dụng một phép biến đổi Fourier nghịch đảo để quay lại hình ảnh gốc, điều này rất khác biệt so với biến đổi Fourier. Bạn có thể sử dụng Numpy từ

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 100
angle = np.pi/9
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
3 để tính toán biến đổi Fourier nghịch đảo.

Tại sao điều này lại hữu ích? Bởi vì khi bạn xác định một cặp điểm trong biến đổi Fourier, bạn có thể trích xuất chúng trong số tất cả các điểm khác và tính toán biến đổi Fourier nghịch đảo của một mảng được tạo thành từ hai điểm này và có giá trị 0 ở mọi nơi khác. Biến đổi Fourier nghịch đảo này sẽ cung cấp cho cách tử hình sin được đại diện bởi hai điểm này.

Hãy để xác nhận đây là trường hợp với tập lệnh

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

wavelength = 200
y = np.sin(2 * np.pi * x / wavelength)

plt.plot(x, y)
plt.show()
2 bạn đã viết trước đó. Bạn có thể quay lại một phiên bản đầu tiên, nơi bạn có một cách tử hình sin duy nhất:

y=A\sin\left(\frac{2\pi x}{\lambda}+\phi\right)
3

Có một bước bổ sung cho mã từ trước đó. Bây giờ bạn thực hiện biến đổi Fourier nghịch đảo của biến đổi Fourier mà bạn đã tính toán từ cách tử hình sin ban đầu. Kết quả không còn là một mảng các số phức tạp mà có số thực. Tuy nhiên, giới hạn tính toán dẫn đến tiếng ồn trong phần tưởng tượng. Do đó, bạn chỉ lấy phần thực của kết quả.

Đầu ra của mã trên là bộ ba ô sau:

Hướng dẫn fourier transform image python - trăn hình ảnh biến đổi fourier

Hình ảnh bên phải là biến đổi Fourier nghịch đảo của hình ảnh ở giữa. Đây là cùng một cách tử như bản gốc ở bên trái.

Tìm tất cả các cặp điểm trong biến đổi Fourier 2D

Hãy để Lôi nhảy trở lại tập lệnh

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 100
angle = 0
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
8 và tiếp tục từ nơi bạn rời đi trong phần "Tính toán biến đổi 2D Fourier của một hình ảnh trong phần Python". Bạn có thể thêm chức năng thứ hai để tính toán biến đổi Fourier nghịch đảo và các biến để lưu trữ kích thước của mảng và chỉ số của pixel trung tâm:

y=A\sin\left(\frac{2\pi x}{\lambda}+\phi\right)
4

Bạn cũng xác định

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 100
angle = np.pi/9
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
6. Máy phát điện này mang lại các cặp tọa độ bao phủ toàn bộ nửa bên trái của mảng. Nó cũng bao gồm cột trung tâm, chứa pixel trung tâm. Vì các điểm có các cặp đối xứng xung quanh điểm trung tâm trong một phép biến đổi Fourier, bạn chỉ cần đi qua tọa độ trong một nửa của mảng. Sau đó, bạn có thể ghép từng điểm với đối tác của nó ở phía bên kia của mảng.

Bạn cần phải chú ý đặc biệt đến cột giữa, nhưng bạn sẽ đối phó với điều này một chút sau đó.

Sắp xếp tọa độ theo thứ tự khoảng cách từ trung tâm

Khi bạn bắt đầu thu thập các cách tử hình sin riêng lẻ để xây dựng lại hình ảnh gốc, tốt nhất là bạn nên bắt đầu với các cách tử với tần số thấp nhất trước và dần dần di chuyển qua các cách tử hình sin với tần số cao hơn. Do đó, bạn có thể đặt hàng tọa độ trong

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 100
angle = np.pi/9
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
6 dựa trên khoảng cách của chúng với trung tâm. Bạn đạt được điều này với một chức năng mới để tìm ra khoảng cách từ trung tâm,
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 100
angle = np.pi/9
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
8:

y=A\sin\left(\frac{2\pi x}{\lambda}+\phi\right)
5

Hàm

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 100
angle = np.pi/9
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
8 lấy một cặp tọa độ và chỉ số của pixel trung tâm làm đối số và tạo ra khoảng cách của điểm từ trung tâm.

Bạn sử dụng chức năng này làm khóa cho

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength_1 = 200
angle_1 = 0
grating_1 = np.sin(
    2*np.pi*(X*np.cos(angle_1) + Y*np.sin(angle_1)) / wavelength_1
)
wavelength_2 = 100
angle_2 = np.pi/4
grating_2 = np.sin(
    2*np.pi*(X*np.cos(angle_2) + Y*np.sin(angle_2)) / wavelength_2
)

plt.set_cmap("gray")
plt.subplot(121)
plt.imshow(grating_1)
plt.subplot(122)
plt.imshow(grating_2)
plt.show()

gratings = grating_1 + grating_2

# Calculate Fourier transform of the sum of the two gratings
ft = np.fft.ifftshift(gratings)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.figure()
plt.subplot(121)
plt.imshow(gratings)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
0, xác định lại trình tạo
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 100
angle = np.pi/9
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
6 để các điểm theo thứ tự tăng dần của khoảng cách từ trung tâm. Do đó, các điểm đại diện cho tần số ngày càng tăng của các cách tử hình sin.

Tìm điểm đối xứng thứ hai trong mỗi cặp

Bạn có các điểm ở nửa bên trái của biến đổi Fourier theo đúng thứ tự. Bây giờ, bạn cần phải khớp với chúng với điểm tương ứng của chúng ở phía bên kia của biến đổi Fourier 2D. Bạn có thể viết một chức năng cho việc này:

y=A\sin\left(\frac{2\pi x}{\lambda}+\phi\right)
6

Hàm này cũng cần hai đối số: một tập hợp tọa độ và chỉ số của pixel trung tâm. Hàm trả về tọa độ của điểm phù hợp.

Bây giờ bạn đã sẵn sàng để làm việc theo cách của bạn thông qua tất cả các cặp tọa độ. Trong phần tiếp theo, bạn sẽ bắt đầu xây dựng lại hình ảnh từ mỗi cách tử hình sin riêng lẻ.

Sử dụng biến đổi Fourier 2D trong Python để xây dựng lại hình ảnh

Bạn đã sẵn sàng cho ngôi nhà thẳng. Các bước bạn cần tiếp theo là:

  1. Tạo một mảng trống, đầy số không, sẵn sàng để được sử dụng cho từng cặp điểm
  2. Lặp lại thông qua các tọa độ trong
    # gratings.py
    
    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.arange(-500, 501, 1)
    
    X, Y = np.meshgrid(x, x)
    
    wavelength = 100
    angle = np.pi/9
    grating = np.sin(
        2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
    )
    
    plt.set_cmap("gray")
    
    plt.subplot(121)
    plt.imshow(grating)
    
    # Calculate Fourier transform of grating
    ft = np.fft.ifftshift(grating)
    ft = np.fft.fft2(ft)
    ft = np.fft.fftshift(ft)
    
    plt.subplot(122)
    plt.imshow(abs(ft))
    plt.xlim([480, 520])
    plt.ylim([520, 480])  # Note, order is reversed for y
    plt.show()
    6. Đối với mỗi điểm, hãy tìm điểm tương ứng của nó ở phía bên phải để hoàn thành cặp
  3. Đối với mỗi cặp điểm, hãy sao chép các giá trị của các điểm đó từ Fourier biến thành mảng trống
  4. Tính toán biến đổi Fourier nghịch đảo của mảng chứa cặp điểm. Điều này mang lại cho cách tử hình sin được đại diện bởi các điểm này

Khi bạn lặp lại thông qua các cặp điểm, bạn có thể thêm từng cách tử hình sin mà bạn lấy cho các điểm trước. Điều này sẽ dần dần xây dựng hình ảnh, bắt đầu từ các cách tử tần số thấp đến tần số cao nhất vào cuối:

y=A\sin\left(\frac{2\pi x}{\lambda}+\phi\right)
7

Bạn đã thêm một chức năng nữa,

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength_1 = 200
angle_1 = 0
grating_1 = np.sin(
    2*np.pi*(X*np.cos(angle_1) + Y*np.sin(angle_1)) / wavelength_1
)
wavelength_2 = 100
angle_2 = np.pi/4
grating_2 = np.sin(
    2*np.pi*(X*np.cos(angle_2) + Y*np.sin(angle_2)) / wavelength_2
)

plt.set_cmap("gray")
plt.subplot(121)
plt.imshow(grating_1)
plt.subplot(122)
plt.imshow(grating_2)
plt.show()

gratings = grating_1 + grating_2

# Calculate Fourier transform of the sum of the two gratings
ft = np.fft.ifftshift(gratings)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.figure()
plt.subplot(121)
plt.imshow(gratings)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
3, mà bạn sử dụng để hiển thị từng cách tử hình sin riêng lẻ và hình ảnh được xây dựng lại. Bạn sử dụng
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength_1 = 200
angle_1 = 0
grating_1 = np.sin(
    2*np.pi*(X*np.cos(angle_1) + Y*np.sin(angle_1)) / wavelength_1
)
wavelength_2 = 100
angle_2 = np.pi/4
grating_2 = np.sin(
    2*np.pi*(X*np.cos(angle_2) + Y*np.sin(angle_2)) / wavelength_2
)

plt.set_cmap("gray")
plt.subplot(121)
plt.imshow(grating_1)
plt.subplot(122)
plt.imshow(grating_2)
plt.show()

gratings = grating_1 + grating_2

# Calculate Fourier transform of the sum of the two gratings
ft = np.fft.ifftshift(gratings)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.figure()
plt.subplot(121)
plt.imshow(gratings)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
4 để hình đầu tiên, hiển thị hình ảnh và biến đổi Fourier của nó, được hiển thị trong hai giây trước khi chương trình tiếp tục.

Thuật toán chính, bao gồm bốn bước được liệt kê ở trên, hoạt động theo toàn bộ biến đổi Fourier, lấy các cách tử hình sin và tái cấu trúc hình ảnh cuối cùng. Các nhận xét trong biển chỉ dẫn mã liên kết giữa các bước này và các phần tương ứng trong mã.

Tăng tốc hoạt hình

Những công việc này. Tuy nhiên, ngay cả đối với một hình ảnh

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 100
angle = np.pi/9
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
1 nhỏ như hình này, có 45.300 cách tử hình sin riêng lẻ. Bạn cần phải tăng tốc hoạt hình một chút. Bạn có thể làm điều này bằng cách chỉ hiển thị một số bước:

y=A\sin\left(\frac{2\pi x}{\lambda}+\phi\right)
8

Bạn có thể điều chỉnh các tham số để tăng tốc hoặc làm chậm hoạt hình tái thiết. Cụ thể, bạn có thể sử dụng giá trị nhỏ hơn cho

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength_1 = 200
angle_1 = 0
grating_1 = np.sin(
    2*np.pi*(X*np.cos(angle_1) + Y*np.sin(angle_1)) / wavelength_1
)
wavelength_2 = 100
angle_2 = np.pi/4
grating_2 = np.sin(
    2*np.pi*(X*np.cos(angle_2) + Y*np.sin(angle_2)) / wavelength_2
)

plt.set_cmap("gray")
plt.subplot(121)
plt.imshow(grating_1)
plt.subplot(122)
plt.imshow(grating_2)
plt.show()

gratings = grating_1 + grating_2

# Calculate Fourier transform of the sum of the two gratings
ft = np.fft.ifftshift(gratings)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.figure()
plt.subplot(121)
plt.imshow(gratings)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
6. Lưu ý rằng trong mã này, tôi đã không chọn tuyến đường nhanh nhất, mà là một tuyến tập trung vào việc thực hiện biến đổi 2D Fourier trong Python. Tái cấu trúc mỗi cách tử hình hình sin từ một cặp điểm sử dụng biến đổi Fourier nghịch đảo là tốn thời gian. Có thể trích xuất các tham số của cách tử từ các giá trị của cặp điểm này, sau đó tạo ra cách tử hình sin trực tiếp mà không sử dụng biến đổi Fourier nghịch đảo.

Đầu ra từ mã này là video dưới đây:

Các thành phần tần số thấp cung cấp nền tổng thể và hình dạng chung trong hình ảnh. Bạn có thể thấy điều này trong chuỗi của một vài thuật ngữ đầu tiên:

Hướng dẫn fourier transform image python - trăn hình ảnh biến đổi fourier

Khi nhiều tần số được thêm vào, chi tiết hơn được bao gồm trong hình ảnh. Các chi tiết tốt đến ở cuối với tần số cao nhất. Nếu bạn muốn lưu hình ảnh vào tệp, bạn có thể sử dụng

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength_1 = 200
angle_1 = 0
grating_1 = np.sin(
    2*np.pi*(X*np.cos(angle_1) + Y*np.sin(angle_1)) / wavelength_1
)
wavelength_2 = 100
angle_2 = np.pi/4
grating_2 = np.sin(
    2*np.pi*(X*np.cos(angle_2) + Y*np.sin(angle_2)) / wavelength_2
)

plt.set_cmap("gray")
plt.subplot(121)
plt.imshow(grating_1)
plt.subplot(122)
plt.imshow(grating_2)
plt.show()

gratings = grating_1 + grating_2

# Calculate Fourier transform of the sum of the two gratings
ft = np.fft.ifftshift(gratings)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.figure()
plt.subplot(121)
plt.imshow(gratings)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
7.

Hình ảnh có kích thước khác nhau

Trong kho lưu trữ tệp, bạn sẽ tìm thấy một vài hình ảnh khác để thử nghiệm và bạn cũng có thể sử dụng hình ảnh của riêng mình. Bạn cần đảm bảo rằng hình ảnh bạn sử dụng trong thuật toán có số lượng hàng và cột lẻ, và nó đơn giản nhất để sử dụng hình ảnh vuông. Bạn có thể thêm một chút nữa vào

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

wavelength = 100
angle = 0
grating = np.sin(
    2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength
)

plt.set_cmap("gray")

plt.subplot(121)
plt.imshow(grating)

# Calculate Fourier transform of grating
ft = np.fft.ifftshift(grating)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
8 để đảm bảo rằng bất kỳ hình ảnh nào bạn tải đều được cắt xuống hình ảnh vuông với kích thước lẻ:

y=A\sin\left(\frac{2\pi x}{\lambda}+\phi\right)
9

Video bạn đã xem khi bắt đầu bài viết này là kết quả của mã này. Ngoài ra còn có một hình ảnh mẫu thứ ba trong kho lưu trữ tệp, cung cấp đầu ra sau:

Bây giờ bạn có thể sử dụng bất kỳ hình ảnh nào với mã này.

Từ cuối cùng

Biến đổi Fourier là một chủ đề hấp dẫn. Họ có rất nhiều công dụng trong nhiều ngành khoa học. Trong bài viết này, bạn đã khám phá cách biến đổi Fourier 2D trong Python có thể được sử dụng để giải mã và xây dựng lại bất kỳ hình ảnh nào. Liên kết giữa biến đổi Fourier và hình ảnh đi xa hơn thế này, vì nó tạo thành cơ sở của tất cả các quá trình hình ảnh trong thế giới thực, không chỉ trong việc xử lý hình ảnh kỹ thuật số. Các hệ thống hình ảnh từ mắt người đến máy ảnh và nhiều hơn nữa có thể được hiểu bằng cách sử dụng quang học Fourier. Bản chất của cách đi du lịch và tuyên truyền ánh sáng được mô tả thông qua biến đổi Fourier. Nhưng đó là một chủ đề cho một ngày khác!

Các khái niệm bạn đọc trong bài viết này cũng tạo thành cơ sở của nhiều công cụ xử lý hình ảnh. Một số bộ lọc được thực hiện bằng phần mềm chỉnh sửa hình ảnh Sử dụng biến đổi Fourier và áp dụng lọc trong miền Fourier trước khi sử dụng biến đổi Fourier nghịch đảo để tạo hình ảnh được lọc.

Trong bài viết này, bạn đã thấy làm thế nào bất kỳ hình ảnh nào có thể được coi là được tạo thành từ một loạt các cách tử hình sin, mỗi hình có một biên độ, tần số, định hướng và pha khác nhau. Biến đổi 2D Fourier trong Python cho phép bạn giải mã một hình ảnh thành các phần cấu thành này và bạn cũng có thể sử dụng các phần cấu thành này để tạo lại hình ảnh, đầy đủ hoặc một phần.

Đọc thêm và tham khảo

  • Đọc thêm về loạt Fourier và Fourier Biến đổi
  • Tìm hiểu thêm về Numpy trong Chương 8 của Sách mã hóa Python về việc sử dụng Numpy
  • Tìm hiểu thêm về Biến đổi Fourier trong bối cảnh hình ảnh kỹ thuật số và xử lý hình ảnh trong Gonzalez & Woods
  • Bạn có thể đoán rằng cái tên Fourier là tên của người đầu tiên đưa ra mô tả toán học về nguyên tắc này. Bạn có thể đọc về Joseph Fourier ở đây.
  • Tín dụng hình ảnh:
    • Tháp Elizabeth London: Hình ảnh của Lori Lo từ Pixabay
    • Minh họa Trái đất: Hình ảnh của Arek Socha từ Pixabay
    • Ban công Malta: Hình ảnh của Alex B từ Pixabay

[Bài viết này sử dụng Katex của Thomas Churchman]


Nhận các bản cập nhật blog mới nhất

Không có lời hứa thư rác. Bạn sẽ nhận được một email khi một bài đăng trên blog mới được xuất bản


ruột thừa

Tại sao # gratings.py import numpy as np import matplotlib.pyplot as plt x = np.arange(-500, 501, 1) X, Y = np.meshgrid(x, x) wavelength_1 = 200 angle_1 = 0 grating_1 = np.sin( 2*np.pi*(X*np.cos(angle_1) + Y*np.sin(angle_1)) / wavelength_1 ) wavelength_2 = 100 angle_2 = np.pi/4 grating_2 = np.sin( 2*np.pi*(X*np.cos(angle_2) + Y*np.sin(angle_2)) / wavelength_2 ) plt.set_cmap("gray") plt.subplot(121) plt.imshow(grating_1) plt.subplot(122) plt.imshow(grating_2) plt.show() gratings = grating_1 + grating_2 # Calculate Fourier transform of the sum of the two gratings ft = np.fft.ifftshift(gratings) ft = np.fft.fft2(ft) ft = np.fft.fftshift(ft) plt.figure() plt.subplot(121) plt.imshow(gratings) plt.subplot(122) plt.imshow(abs(ft)) plt.xlim([480, 520]) plt.ylim([520, 480]) # Note, order is reversed for y plt.show()9 cần thiết?

Nhìn vào một trong những hình ảnh bạn đã sử dụng trong bài viết này, chẳng hạn như hình ảnh Tháp Elizabeth. Trung tâm của hình ảnh ở đâu? Có vẻ như một câu hỏi ngớ ngẩn, không? Tuy nhiên, khi bạn đại diện cho một hình ảnh dưới dạng một mảng trong Python, pixel với các chỉ số

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

amplitudes = 0.5, 0.25, 1, 0.75, 1
wavelengths = 200, 100, 250, 300, 60
angles = 0, np.pi / 4, np.pi / 9, np.pi / 2, np.pi / 12

gratings = np.zeros(X.shape)
for amp, w_len, angle in zip(amplitudes, wavelengths, angles):
    gratings += amp * np.sin(
        2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / w_len
    )

# Calculate Fourier transform of the sum of the gratings
ft = np.fft.ifftshift(gratings)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.set_cmap("gray")
plt.subplot(121)
plt.imshow(gratings)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
0 là hình ảnh ở trên cùng bên phải. Đây là trung tâm hiệu quả của hình ảnh từ quan điểm toán học.

Bây giờ hãy xem xét hình ảnh của Fourier biến đổi mà bạn đã thấy ở trên, trong đó tâm của hình ảnh có ý nghĩa và khoảng cách của các điểm từ trung tâm này chứa thông tin quan trọng về tần số của các cách tử hình sin.

Các chức năng

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

amplitudes = 0.5, 0.25, 1, 0.75, 1
wavelengths = 200, 100, 250, 300, 60
angles = 0, np.pi / 4, np.pi / 9, np.pi / 2, np.pi / 12

gratings = np.zeros(X.shape)
for amp, w_len, angle in zip(amplitudes, wavelengths, angles):
    gratings += amp * np.sin(
        2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / w_len
    )

# Calculate Fourier transform of the sum of the gratings
ft = np.fft.ifftshift(gratings)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.set_cmap("gray")
plt.subplot(121)
plt.imshow(gratings)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
1 và
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

amplitudes = 0.5, 0.25, 1, 0.75, 1
wavelengths = 200, 100, 250, 300, 60
angles = 0, np.pi / 4, np.pi / 9, np.pi / 2, np.pi / 12

gratings = np.zeros(X.shape)
for amp, w_len, angle in zip(amplitudes, wavelengths, angles):
    gratings += amp * np.sin(
        2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / w_len
    )

# Calculate Fourier transform of the sum of the gratings
ft = np.fft.ifftshift(gratings)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.set_cmap("gray")
plt.subplot(121)
plt.imshow(gratings)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
2 chăm sóc việc này. Hãy cùng nhìn vào những gì
# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

amplitudes = 0.5, 0.25, 1, 0.75, 1
wavelengths = 200, 100, 250, 300, 60
angles = 0, np.pi / 4, np.pi / 9, np.pi / 2, np.pi / 12

gratings = np.zeros(X.shape)
for amp, w_len, angle in zip(amplitudes, wavelengths, angles):
    gratings += amp * np.sin(
        2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / w_len
    )

# Calculate Fourier transform of the sum of the gratings
ft = np.fft.ifftshift(gratings)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.set_cmap("gray")
plt.subplot(121)
plt.imshow(gratings)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
1 làm cho một mảng nhỏ trước:

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

wavelength = 200
y = np.sin(2 * np.pi * x / wavelength)

plt.plot(x, y)
plt.show()
0

Bốn góc phần tư được hoán đổi để phần tư phía trên bên trái bây giờ là phần dưới bên phải, v.v. Điều này có thể được biểu diễn bằng đồ họa với sơ đồ sau:

Hướng dẫn fourier transform image python - trăn hình ảnh biến đổi fourier

Điều gì xảy ra với mảng nếu nó có số lượng hàng và cột lẻ? Những góc phần tư nào nên được xem xét hàng và cột trung tâm? Đây là lý do tại sao có hai chức năng, sự thay đổi FFT và nghịch đảo của nó:

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

wavelength = 200
y = np.sin(2 * np.pi * x / wavelength)

plt.plot(x, y)
plt.show()
1

Nhìn vào pixel trung tâm quan trọng, có giá trị

# gratings.py

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-500, 501, 1)

X, Y = np.meshgrid(x, x)

amplitudes = 0.5, 0.25, 1, 0.75, 1
wavelengths = 200, 100, 250, 300, 60
angles = 0, np.pi / 4, np.pi / 9, np.pi / 2, np.pi / 12

gratings = np.zeros(X.shape)
for amp, w_len, angle in zip(amplitudes, wavelengths, angles):
    gratings += amp * np.sin(
        2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / w_len
    )

# Calculate Fourier transform of the sum of the gratings
ft = np.fft.ifftshift(gratings)
ft = np.fft.fft2(ft)
ft = np.fft.fftshift(ft)

plt.set_cmap("gray")
plt.subplot(121)
plt.imshow(gratings)

plt.subplot(122)
plt.imshow(abs(ft))
plt.xlim([480, 520])
plt.ylim([520, 480])  # Note, order is reversed for y
plt.show()
4 trong mảng gốc. Một trong những chức năng đặt điều này ở cuối mảng (dưới cùng bên phải), trong khi các chức năng khác đặt nó ở vị trí đầu tiên (trên cùng bên trái).


Nhận các bản cập nhật blog mới nhất

Không có lời hứa thư rác. Bạn sẽ nhận được một email khi một bài đăng trên blog mới được xuất bản