使用反向卷积消除图像中的噪声
让我们使用库应用算法来消除图像中的噪声和模糊 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]:
我们看到原始图像,然后是添加了噪声的模糊图像,以及恢复的失真。
当我们没有原始图像和滤波器模型(即在通常的现实场景中)时,维纳的逆卷积也起作用。 只需粗略了解原始信号和滤波器的功率谱即可执行反向卷积。
In [ ]:
img2 = channelview( testimage("livingroom") ) # Загрузим другое изображение
noise2 = rand(Float64, size(img)) # Другая модель шума с
# Уберем шум с пролого изображения при помощи обратной свертки
polished2 = wiener( blurred_img, img2, noise2, blurring );
[ Gray.( img2 ) Gray.( polished2 ) ]
Out[0]:
左边的图像给了算法一个清除图像的光谱应该是什么样子的想法。 由于我们在创建滤镜时没有对模糊进行建模 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) ]
Out[0]:
结论
我们已经成功地测试了几种图像恢复算法,并取得了良好的效果。


