2015-08-04 3 views
0

Недавно я использовал гауссову свертку для размытия изображения. Он работает хорошо, на самом деле он отлично работает. Однако теперь я пытаюсь изменить его, и мой инверсный фильтр продолжает сталкиваться с проблемами. Предполагается, что фильтр должен работать по следующему принципу:Обратный фильтр для гауссовского размытия

G (x, y)/H (x, y) = F (x, y), где G (x, y) - преобразование Фурье размытого изображения , H (x, y) - преобразование Фурье функции размытия, а F (x, y) - преобразование Фурье исходного изображения.

В настоящее время полученное изображение выглядит точно так же, как оригинал. Мой алгоритм выглядит следующим образом:

from PIL import Image 
import math 
import cmath 
import numpy as np 

def reverseGaussianBlur(picture, r): 
    rs = int(math.ceil(r * 2.57)     # Calculate significant radius 
    w, h = picture.size 
    pixels = list(picture.getdata())    # Image's pixels as list 
    fft_pixels = runFourier(pixels, False)  # Run FFT 
    temp_picture = [] 
    for u in range(0, h): 
     for v in range(0, w): 
      val = [0] * 3 
      wsum = 0 
      for iy in range(u - rs, u + rs + 1): 
       y = min(h - 1, max(0, iy)) 
       for ix in range(v - rs, v + rs + 1): 
        x = min(w - 1, max(0, ix)) 
        weight = (2 * math.pi) ** 0.5 * cmath.exp(-r * r * ((ix - v) * 
         (ix - v) + (iy - u) * (iy - u))/2) 
        if (weight.real > 1e-5): 
         val = [n + p/weight for n, p in zip(val, fft_pixels[y * w + x])] 
        wsum += weight 
      temp_picture.append(tuple([v * wsum for v in val])) 
    return_picture = [tuple(int(round(p)) for p in pixel) for pixel in 
     runFourier(temp_picture, True)]   # Run Inverse FFT 
    return return_picture 

В любом случае, я не совсем уверен, что случилось, и любая помощь будет замечательной.

+0

«На практике результаты часто весьма разочаровывают», согласно Ив Даусту в http://stackoverflow.com/questions/21791982/reverse-image-blur-filter-not-unsharp-mask. Он предлагает использовать фильтр Вайнера. –

+0

Если бы речь шла об обратном размывании, вызванном каким-то естественным явлением, я бы принял его, но я вызвал размытие в первую очередь. Кажется, я мог бы его отменить, но опять же, может быть, слишком много информации было потеряно, когда я размыл изображение. – Woody1193

ответ

0

Когда вы размываете изображение, вы в основном удаляете высокочастотные компоненты. Они ушли. Обратного фильтра нет. Если вы применили «фильтр», который взял каждый пиксель и заменил его плоским белым, вы бы не ожидали, что для этого будет обратный фильтр, потому что все детали (кроме размера исходного изображения) теряются , Это одно и то же с размытием, только вы потеряли только компоненты высокой частоты.