Удаление размытости изображения с помощью обратного фильтра в частотной области

#matlab #image-processing #gaussianblur

#matlab #обработка изображений #Размытие по Гауссу

Вопрос:

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

Примените 2D-DFT к гауссовскому фильтру пространственной области, в результате чего будет создан гауссовский фильтр частотной области. Создайте обратный фильтр Гаусса в частотной области, взяв обратное значение всех коэффициентов фильтра Гаусса в частотной области. Примените обратный 2DDFT и возьмите вещественные части, чтобы создать обратный фильтр Гаусса в пространственной области (теоретически мнимые части равны 0, но могут быть не полностью равны 0 из-за числовых ошибок).

Размер фильтра размытия составляет 21×21, а размер исходного изображения — 256×256. Вот мой код размытия в Matlab.

 Img = imread('text.tif');
img = im2double(Img);
gf = zeros(21);
for i = 1:21
    for j = 1:21
        gf(i,j) = (1/(2*pi))*exp(-((i-10.5)^2 (j-10.5)^2)/2);
    end
end
Convig = conv2(img,gf);
  

Выходное изображение показано ниже.
Размытое изображение

Затем, следуя инструкциям, мой код удаления размытия показан ниже:

 dftgf =fft2(gf);
idftgf = 1./dftgf;
inverse = ifft2(idftgf);
gf2 =real(inverse);
Convig2 = conv2(Convig,gf2);
  

Результат размытия кажется правильным. Но странно, что размытое изображение является неправильной попыткой размытия. Может ли кто-нибудь помочь мне с моим кодом? Заранее спасибо.

Ответ №1:

Хорошо, наконец, я нашел ошибку. Для формулы фильтра Гуассиана сказано, что

 gf(i,j) = (1/(2*pi*sigma^2))*exp(-((i-center)^2 (j-center)^2)/(2*sigma^2);
  

но здесь я использовал «10.5» напрямую. Если я использую «11» в качестве центра, результирующее изображение будет правильным.

Таким образом, псевдокод удаления должен быть:

 [m,n] = size(filter)
centerx = m 1/2
centery = n 1/2
gf(i,j) = (1/(2pi*sigma^2))*exp(-((i-centerx)^2 (j-centery)^2)/(2*sigma^2);
  

Однако, даже если я нашел ошибку, я до сих пор не знаю, почему она не может быть десятичной. Может быть, обработка изображений — это своего рода дискретное программирование?

Комментарии:

1. Хороший улов, обычно ядра центрального фильтра должны быть целым числом. Во время свертки центральный пиксель определяет положение результирующего. Вот gif, показывающий процесс commons.wikimedia.org/wiki/File:2D_Convolution_Animation.gif .

2. Кроме того, 11-й пиксель является центральным пикселем, поскольку слева от него будет 10 пикселей, а справа — еще 11 пикселей.