2011-10-28 31 views
6

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: spatial convolition

Tần Convolution: lưu ý padding cùng trên/trái. frequency convolution

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" my f_hat_frequency

của tôi "f_hat_spatial" :-( my 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

+0

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

+0

Rất tiếc. Bạn nói đúng. Tôi đang sửa bài đăng của mình. –

Trả lời

2

Vấn đề rõ ràng là FF_HAT2 là không giống nhau. Thực tế là bạn cần gọi nan_to_num là một dấu hiệu rõ ràng cho thấy có sự cố giữa phép nhân và phép chia cho K. Nguyên nhân có thể là tràn số nguyên. Hãy thử chuyển đổi f thành loại điểm động sau khi tải.

+0

Lena trong phao không giúp được gì. :-(Trang này http://www.owlnet.rice.edu/~elec539/Projects99/BACH/proj2/inverse.html đã giúp khá nhiều, tôi có thể lấy lại hình ảnh kém. Nhưng ít nhất tôi bắt đầu để hiểu được chiều sâu của vấn đề của tôi. –

Các vấn đề liên quan