Lớp xử lý hình ảnh của tôi đã được gán một dự án khôi phục hình ảnh. Tôi hiện đang làm việc trên Bộ lọc nghịch đảo. hình ảnh -> degrade -> bộ lọc nghịch đảo -> khôi phục hình ảnh. Tôi đang sử dụng một bộ lọc hộp 5x5 đơn giản cho sự suy thoái của tôi.Bộ lọc nghịch đảo của hình ảnh được hòa trộn so với tần số không gian
Nếu tôi xoay hình ảnh trong miền không gian, hãy di chuyển đến miền tần số, sau đó đảo ngược Lọc hình ảnh được chuyển đổi với fft của hạt nhân, tôi sẽ thấy một mớ hỗn độn. Nếu tôi kết hợp hình ảnh trong miền tần số, thì Bộ lọc nghịch đảo hình ảnh đó, tôi sẽ có được một hình ảnh tốt.
Chuyển đổi miền tần số và miền không gian phải giống hệt nhau. Suy nghĩ duy nhất của tôi là tôi đang làm điều gì đó sai với hạt nhân? Tôi đang sử dụng bộ lọc hộp 5x5. Các convolution không gian chia kết quả cuối cùng bởi np.sum (hộp). Tôi đã cố gắng chuẩn hóa hộp thông qua:
box = np.ones(25).reshape(5,5)/25.0
nhưng nhận cùng một kết quả thu được.
Tôi cũng nhận thấy hình ảnh được chuyển đổi tần số ("g_freq.png" từ mã bên dưới) được dịch chuyển, có thể do FFT đệm trên cùng và bên trái với phần dưới cùng bên phải của hình ảnh. Điều này có thể gây ra sự cố không?
không gian Convolution:
Tần Convolution: lưu ý padding cùng trên/trái.
Mã đơn giản nhất có thể để tạo sự cố bên dưới. 100% numpy/scipy/matplotlib.
import sys
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy as np
import scipy
from scipy import ndimage
def save_image(data, filename) :
print "saving",filename
plt.cla()
fig = plt.figure()
ax = fig.add_subplot(111)
ax.imshow(data, interpolation="nearest", cmap=matplotlib.cm.gray)
fig.savefig(filename)
f = scipy.misc.lena()
save_image(f, "scipylena.png")
# create a simple box filter
kernel = np.ones(25).reshape(5, 5)
kernel_padded = np.zeros_like(f,dtype="float")
# put kernel into upper left
kernel_padded[:5,:5] = kernel
# FFT kernel, save as image
K = np.fft.fftshift(np.fft.fft2(kernel_padded))
save_image(np.abs(K), "K.png")
# degrade image via spatial convolution
g = ndimage.convolve(f, kernel)
if np.sum(kernel) != 0 :
g /= np.sum(kernel)
# save spatial image
save_image(g, "g_spatial.png")
# take convolved image into frequency domain
G = np.fft.fftshift(np.fft.fft2(g))
# inverse filter the spatially convolved image
F_HAT = G/K
# back to spatial, save the reconstructed image
a = np.nan_to_num(F_HAT)
f_hat = np.fft.ifft2(np.fft.ifftshift(F_HAT))
save_image(np.abs(f_hat), "f_hat_spatial.png")
#
# now the same path but entirely in frequency domain
#
# create a frequency domain convolved image
F = np.fft.fftshift(np.fft.fft2(f))
G2 = F * K
# back to spatial, save frequency convolved image
g2 = np.fft.ifft2(np.fft.ifftshift(G2))
save_image(np.abs(g2), "g_freq.png")
# inverse filter the frequency convolved image
F_HAT2 = G2/K
a = np.nan_to_num(F_HAT2)
f_hat2 = np.fft.ifft2(np.fft.ifftshift(a))
save_image(np.abs(f_hat2), "f_hat_freq.png")
của tôi "f_hat_frequency"
của tôi "f_hat_spatial" :-(
Rất cám ơn sự giúp đỡ nào.
[EDIT] Tôi đang chạy trên Mac OSX 10.6.8 sử dụng Numpy 1.6.0 thông qua phiên bản 32 bit miễn phí của Enthought. (http://www.enthought.com/products/epd_free.php) Python 2.7.2 | EPD_free 7.1-1 (32-bit)
EDIT 31 tháng 10 năm 2011. Tôi nghĩ rằng những gì tôi đang cố gắng làm có nguồn gốc toán học sâu sắc hơn tôi hiểu. http://www.owlnet.rice.edu/~elec539/Projects99/BACH/proj2/inverse.html đã giúp một chút. Thêm mã sau đây vào mã của tôi trước bộ lọc nghịch đảo:
H_HAT = np.copy(K)
np.putmask(H_HAT, H_HAT>0.0001, 0.0001)
cung cấp cho tôi hình ảnh nhưng có nhiều chuông (có thể do bộ lọc hộp của tôi; cần chuyển sang Gaussian). Ngoài ra, bù đắp của hình ảnh lọc tần số là khá có thể gây ra một vấn đề. Giáo sư của tôi đã xem xét mã của tôi, không thể tìm thấy một vấn đề. Đề xuất của cô ấy là tiếp tục sử dụng hình ảnh được lọc tần số thay vì hình ảnh được lọc không gian.
Tôi có một câu hỏi tương tự trên dsp.stackexchange.com: https://dsp.stackexchange.com/questions/538/using-the-inverse-filter-to-correct-a-spatially-convolved-image
Tôi đã chạy mã và có vẻ như các nhãn được đưa ra ở trên cho f_hat_spatial và f_hat_frequency được đổi chỗ (đó thực sự là hình ảnh "f_hat_spatial" không tái tạo). – nobar
Rất tiếc. Bạn nói đúng. Tôi đang sửa bài đăng của mình. –