Я правильно использую Numpy для вычисления обратного фильтра? - PullRequest
1 голос
/ 25 октября 2011

В рамках класса обработки цифровых изображений нам был назначен обратный фильтр для восстановления изображений.Я использую NumPy.Приведенные ниже имена переменных пытаются следовать именам в Цифровая обработка изображений Гонсалес + Вудс, 3e.

Увеличение исходного изображения.A zoom of the original image.

Гауссово ядро ​​"zz.tif" того же размера, что и исходное изображение.Gaussian kernel

Увеличение сглаженного гауссовского изображения без добавления шума Zoom of the gaussian smoothed image with no noise added

f = imtools.load_image( sys.argv[1], mode="L", dtype="float" )
zz = imtools.load_image( "zz.tif", mode="L", dtype="float" )

F = np.fft.fft2( f )
F2 = np.fft.fftshift( F )

# normalize to [0,1]
H = zz/255.

# calculate the damaged image
G = H * F2

# Inverse Filter 
F_hat = G / H

# cheat? replace division by zero (NaN) with zeroes
a = np.nan_to_num(F_hat)
f_hat = np.fft.ifft2( np.fft.ifftshift(a) )

imtools.save_image( np.abs(f_hat), "out.tif" )

imtools - это просто моя обертка, использующая PIL + numpy для загрузки / сохранения изображений.(Можно также опубликовать этот src.)

Увеличение изображения с обратной фильтрацией.Zoom of the inverse filtered image.

Правильно ли рассчитан обратный фильтр?Правильно ли я использую numpy?

Ожидается ли звонок на конечном изображении или я что-то не так делаю?

Ответы [ 2 ]

3 голосов
/ 25 октября 2011

В общем, да, кажется, вы все делаете правильно, насколько я знаю.

Звон из-за чрезмерно «острого» фильтра верхних частот, но это именно тот метод, который вы используете.

Однако вы можете рассмотреть возможность использования numpy.fft.rfft2 ("real fft") и numpy.fft.irfft2 вместо numpy.fft.fft2 и numpy.fft.ifft2, потому что вы имеете дело только с реальными значениями. Это должно быть немного быстрее.

2 голосов
/ 08 декабря 2014

Я не знаю много о Python, но «обратный звонок» является нормальным для обратного фильтра. Феномен Гиббса лежит в основе звонка. Поскольку входные данные не совсем гладкие, но имеют некоторые разрывы, для их полного представления в принципе необходимо бесконечное число компонент Фурье. Здесь достаточно конечного числа компонентов, так как разрешение дисплея конечно, изображение пикселировано. Однако некоторая информация теряется в записанном изображении из-за умножения на нули в H, вследствие чего восстановленное изображение аппроксимирует входное изображение с компонентами, покрывающими конечную полосу пропускания, меньшую, чем у дисплея, показывая колебания Гиббса.

Чтобы смягчить это, используйте правильную регуляризацию, как с 2D-фильтром Винера: F_hat = G * H.conjugate () / (abs (H) 2 + NSR 2), где NSR - оценка шума отношение сигнала, например линейно увеличивается от 0 до 10 на самой высокой пространственной частоте. Это будет учитывать конечное отношение сигнал / шум, и когда оценка NSR будет достаточно близкой, вы должны увидеть небольшой «звонок» после восстановления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...