Engee 文档
Notebook

使用反向卷积消除图像中的噪声

让我们使用库应用算法来消除图像中的噪声和模糊 Deconvolution.

任务说明

反卷积或反向卷积(deconv)是一种与卷积相反的操作,它允许您使用已知或估计的滤波器模型获得原始信号(或恢复图像)。 在我们的场景中,当我们提高图像质量时,通过filter我们指的是对干扰我们图像的过程的描述(模糊,污迹,噪声等。).

该过程的特性通常很难预先知道,并且反向卷积操作本身对滤波器系数中的误差非常敏感。 在创建用于评估过滤器模型参数的过程时,应考虑到这一点。

以下是我们需要的库:

In [ ]:
Pkg.add( ["Images", "TestImages", "Deconvolution", "FFTW", "ZernikePolynomials"] )

维纳的逆卷积

让我们上传实验图像并为其添加噪声。 替换功能 textimage("image")load("image.png") 您可以从光盘中打开任何图像。

In [ ]:
using Images, TestImages, Deconvolution, FFTW

img = channelview(testimage("cameraman"))

# Создадим размывающий фильтр в частотной области
x = hcat(ntuple(x -> collect((1:512) .- 257), 512)...)
k = 0.001
blurring_ft = @. exp(-k*(x ^ 2 + x ^ 2)^(5//6))

# а еще у нас будет аддитивный шум
noise = rand(Float64, size(img))

# Преобразование Фурье позволяет получить картинку с шумом
blurred_img_ft = fftshift(blurring_ft) .* fft(img) .+ fft(noise)

# Преобразуем изображение из частотной в пространственную область (восстановим из спектра)
blurred_img = real(ifft(blurred_img_ft))

# Также получим фильтр в пространственной области
blurring = ifft(fftshift(blurring_ft));

现在让我们执行反向卷积操作,并输出三个粘合成一个的图像:

-原始图像,
-增加噪音的发明,
-滤波图像。

In [ ]:
polished = wiener(blurred_img, img, noise, blurring)

[ Gray.( img ) Gray.(blurred_img) Gray.( polished ) ]
Out[0]:
No description has been provided for this image

我们看到原始图像,然后是添加了噪声的模糊图像,以及恢复的失真。

当我们没有原始图像和滤波器模型(即在通常的现实场景中)时,维纳的逆卷积也起作用。 只需粗略了解原始信号和滤波器的功率谱即可执行反向卷积。

In [ ]:
img2 = channelview( testimage("livingroom") ) # Загрузим другое изображение
noise2 = rand(Float64, size(img)) # Другая модель шума с 

# Уберем шум с пролого изображения при помощи обратной свертки
polished2 = wiener( blurred_img, img2, noise2, blurring );

[ Gray.( img2 ) Gray.( polished2 ) ]
Out[0]:
No description has been provided for this image

左边的图像给了算法一个清除图像的光谱应该是什么样子的想法。 由于我们在创建滤镜时没有对模糊进行建模 noise2 结果不太清楚。

理查森-露西的反向卷积

作为第二个例子,我们使用函数 lucy,其中在使用像差模型已经模糊的图像上实现Richardson-Lucy逆卷积方法。

In [ ]:
using Images, TestImages, Deconvolution, FFTW, ZernikePolynomials

img = channelview( testimage("cameraman") )

# Модели аберрации линзы
blurring = evaluatezernike( LinRange(-16,16,512), OSA.([12, 4, 0]), [1.0, -1.0, 2.0] )
blurring = fftshift(blurring)
blurring = blurring ./ sum(blurring)

blurred_img = fft(img) .* fft(blurring) |> ifft |> real

@time restored_img = lucy(blurred_img, blurring, iterations=1000)

[ Gray.(img)  Gray.( fftshift(blurring .* 255));
  Gray.(blurred_img) Gray.(restored_img) ]
 55.638180 seconds (36.03 k allocations: 35.187 GiB, 0.79% gc time)
Out[0]:
No description has been provided for this image

结论

我们已经成功地测试了几种图像恢复算法,并取得了良好的效果。