Loại bỏ một vật phẩm hình sin khỏi một bộ khung phim


7

Tôi đang thực hiện một số phân tích hậu đại học của một bộ dữ liệu bao gồm một loạt các khung phim bị ô nhiễm bởi một tạo tác định kỳ mạnh mẽ. Tôi muốn loại bỏ vật phẩm này khỏi khung của tôi.

Để dễ dàng vẽ đồ thị, tôi vừa định hình lại mảng Mgiá trị pixel của mình [nframes, npixels], sau đó lấy trung bình trên tất cả các giá trị pixel để cung cấp cho tôi vectơ 1D m. Đây là tín hiệu này trông như thế nào trong miền thời gian. Bạn có thể thấy dao động khá rõ ràng trong hình nhỏ được phóng to.

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

Sau đó tôi thực hiện một biểu đồ bằng cách lấy Fm = rfft(m)và vẽ theo abs(Fm)**2tần số. Tôi thấy một đỉnh rất sắc nét ở ~ 1,5Hz:

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

Cũng như tính tuần hoàn theo thời gian, dường như cũng có một thành phần không gian yếu hơn đối với vật phẩm này, vì ở giá trị tần số cực đại chính xác dường như có một sự thay đổi trơn tru theo pha trên trục x của khung hình của tôi, do đó, các pixel trên bên phải có xu hướng trễ pixel ở bên trái:

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

Là một cách tiếp cận mạnh mẽ, tôi đã thử chỉ lọc từng pixel trong miền thời gian bằng bộ lọc notch tập trung vào 1,5Hz. Tôi đã sử dụng bộ lọc Butterworth theo thứ tự 4 với tần số tới 1,46 và 1,52Hz (Tôi không rành về thiết kế bộ lọc, vì vậy tôi chắc chắn có thể có nhiều lựa chọn phù hợp hơn).

Đây là tín hiệu pixel trung bình trông như thế nào sau khi lọc: nhập mô tả hình ảnh ở đây

Và biểu đồ tương ứng: nhập mô tả hình ảnh ở đây

Bộ lọc notch thực hiện rất tốt công việc giảm vật phẩm, nhưng về cơ bản nó trông giống như một hình sin cố định thuần túy, tôi không thể không nghĩ rằng tôi có thể làm tốt hơn là chỉ làm giảm phần không gian tần số đó.

Ý tưởng ban đầu (rất ngây thơ) của tôi là làm một việc như:

  1. Lấy tần số, pha và biên độ dao động từ phổ Fourier cho mỗi pixel trong phim
  2. Tái tạo dao động trong miền thời gian
  3. Trừ nó ra khỏi khung phim

Tôi nhận ra đây không phải là điều mà mọi người thường làm, vì sự can thiệp thường không quá thuần túy và tạm thời, nhưng tôi tự hỏi liệu nó có ý nghĩa gì trong trường hợp của tôi không?

Dữ liệu

Ngăn xếp TIFF 16 bit đầy đủ (~ 2GB không nén)

Phiên bản 8 bit bị suy giảm không gian (~ 35 MB không nén)


Bắt đầu từ một loạt các khung phim, bạn có thể vui lòng làm rõ hơn cách bạn tạo PSD chính xác không?
Tarin Ziyaee

@ user4619 rất thô sơ - với mỗi khung hình tôi vừa tính giá trị pixel trung bình để tạo ra một vectơ x, sau đó tôi lấy Fx = rfft(x)và lấy sức mạnh làabs(Fx)**2
ali_m

Bạn có khung hình 2 chiều và sau đó bạn tạo một vectơ 1 chiều trung bình. Cùng x? Cùng y?
Tarin Ziyaee

@ user4619 dọc theo cả x và y - Tôi định hình lại phim của mình thành một khung hình bằng mảng npixels, sau đó trung bình trên tất cả các pixel
ali_m

Ok, cảm ơn vì chi tiết đó - nó quan trọng trong phân tích. Vui lòng thêm thông tin này vào bài viết của bạn.
Tarin Ziyaee

Câu trả lời:


1

Giải pháp đề xuất của bạn - tính toán một hình sin trong miền thời gian dựa trên đỉnh trong FFT, sau đó trừ nó - nên hoạt động, nhưng có một cách dễ dàng hơn để thực hiện điều tương tự: sửa đổi giá trị đỉnh đó trong FFT, sau đó lấy nghịch đảo biến đổi.

Vì vậy, đối với video rasterized của M[nframes, npixels]bạn, bạn tìm thấy thùng tần số giữ vật phẩm, sau đó làm phẳng nó một cách có hệ thống (ví dụ: đặt cường độ của nó ở mức trung bình của các lân cận) cho mỗi pixel:

import numpy as np
nframes, npixels = np.shape(M)
# Identify the bin containing the sinusoidal artifact
# Use the average intensity for each image
m = np.mean(M, axis=1)
# Calculate the FFT
Fm = np.fft.rfft(m)
# Find the largest bin away from the low-frequency region
lowfreq = 100  # or something
badbin = lowfreq + np.argmax(Fm[lowfreq:]**2)

# Now adjust the amplitude of that bin in the FFT of each pixel
for pixel in range(npixels):
   Fpix = np.fft.rfft(M[:, pixel])
   # Scale magnitude of artifact bin to be the mean of its neighbors
   Fpix[badbin] *= np.mean(np.absolute(Fpix[[badbin-1, badbin+1]]))/np.absolute(Fpix[badbin])
   # Rewrite the time sequence of that pixel
   M[:,pixel] = np.fft.irfft(Fpix)

Điều này sẽ hoạt động nếu tạo tác chính xác là biên độ và tần số không đổi, và tần số của nó rơi đúng vào một phần phụ của độ dài chuỗi (nghĩa là các hình sin được biểu thị bởi FFT). Nói chung, bạn có thể muốn làm phẳng một hoặc hai thùng hai bên badbinđể đối phó với một tập hợp các băng hẹp hẹp hơn một chút, ví dụ:

# ...

   # Scale magnitude of artifact binS to be the mean of neighbors
   spread = 3  # flatten bins from (badbin - (spread-1)) to (badbin + (spread-1))
   # target value for new bins
   targetmag = np.mean(np.absolute(Fpix[[badbin-spread, badbin+spread]]))
   bins = range(badbin - (spread-1), badbin + spread)
   Fpix[bins] *= targetmag/np.abs(Fpix[bins])
   # ...

Nếu bạn muốn hạn chế thành phần bị xóa khỏi từng pixel để có cùng tần số và pha của tạo phẩm được phát hiện ở cường độ trung bình, bạn có thể loại bỏ chỉ hình chiếu của badbincường độ lên pha đó, ví dụ:

badbinphase = np.angle(Fm[badbin])
# ...

   Ncomponent = np.abs(Fpix[badbin])*np.cos(np.angle(Fpix[badbin]) - badbinphase)
   Fpix[badbin] -= Ncomponent * np.exp(0+1j * badbinphase)
   # ...

Lưu ý rằng thành phần kết quả lúc badbinnày sẽ luôn luôn được dịch pha 90 độ (trực giao) từ toàn cầu badbinphasetrong mọi pixel - mọi thành phần tín hiệu ở tần số chính xác và pha đó không thể tách rời khỏi tạo tác.


Đó không phải là những gì tôi đã làm với bộ lọc notch sao? Tuy nhiên, tôi vẫn nghĩ rằng nó không hoàn toàn lý tưởng, vì cách tiếp cận này không tính đến thông tin về pha dao động mà tôi đang cố gắng loại bỏ, nó không đổi theo thời gian. Đối với tôi, có vẻ như có thể loại bỏ một cách có chọn lọc vật phẩm mà không ảnh hưởng đến tín hiệu 'chính hãng' rơi vào cùng dải tần số.
ali_m

Đó không phải là chính xác những gì bạn đã làm: đầu tiên, đó là một notch hẹp hơn nhiều; thứ hai, không giống như bộ lọc Butterworth, nó không gây ra biến dạng pha. Nếu bạn trừ các FFT trước và sau khi sửa đổi, bạn sẽ có được một thành phần khác không với biên độ và pha của đột biến ban đầu. Đây là tín hiệu chúng ta loại bỏ trong miền thời gian, tức là một hình sin có biên độ không đổi ở chính xác tần số và pha của cực đại phổ. Nếu tín hiệu cơ bản có năng lượng trong vùng này, nó xuất hiện dưới dạng nhiễu trong ước tính, nhưng nên rửa sạch.
dpwe

Tôi nhận ra rằng bạn có thể có nghĩa là thực thi cùng một pha trên mỗi pixel, vì vậy tôi đã thêm nó vào câu trả lời của mình. Tuy nhiên, đó không phải là phép thuật - bạn không thể tách rời thành phần pha và tín hiệu cùng pha, do đó, bạn luôn bị bỏ lại 90% so với vật phẩm ước tính.
dpwe
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.