Engee 文档
Notebook

利用反卷积消除图像中的噪点

让我们使用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]:
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 ,该函数在使用畸变模型进行模糊处理的图像上实现了理查森-卢西反卷积法。

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

结论

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