利用反卷积消除图像中的噪点¶
让我们使用Deconvolution
库来应用去除图像噪点和模糊的算法。
问题描述¶
解卷积或反卷积 (deconv
) 是一种与卷积相反的操作,它允许我们在已知或估计的滤波模型下检索原始信号(或重建图像)。在我们的场景中,当我们要进行图像增强时,滤波器指的是描述将干扰引入图像的过程(模糊、虚化、噪声等)。
这一过程的特征通常很难事先知道,而且反卷积操作本身对滤波器系数的误差非常敏感。在创建滤波模型参数估计程序时应考虑到这一点。
下面是我们需要的库:
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
,该函数在使用畸变模型进行模糊处理的图像上实现了理查森-卢西反卷积法。
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]:
结论¶
我们已经成功测试了几种图像修复算法,并取得了良好的效果。