(数字图像处理MATLAB+Python)第八章图像复原-第三、四节:图像复原代数方法和典型图像复原方法

news2025/1/19 16:13:34

文章目录

  • 一:图像复原代数方法
    • (1)无约束最小乘方复原
    • (2)约束复原
  • 二:典型图像复原方法
    • (1)逆滤波复原
      • A:概述
      • B:程序
    • (2)维纳滤波复原
      • A:概述
      • B:程序
    • (3)等功率谱滤波
      • A:概述
      • B:程序
    • (4)几何均值滤波
    • (5)约束最小二乘法滤波
      • A:概述
      • B:程序
    • (6)Richardson-Lucy算法
      • A:概述
      • B:程序

一:图像复原代数方法

图像复原代数方法:根据退化模型,假设具备关于 g g g H H H n n n的某些先验知识,确定某种最佳准则,寻找原图像 f f f的最优估计

(1)无约束最小乘方复原

无约束最小乘方复原:是一种用于恢复受损图像的方法。它基于最小化平方误差的原则,以尽可能接近原始图像为目标。假设我们有一个受损的图像表示为矩阵 Y Y Y,其大小为 m × n m×n m×n,其中的元素表示像素灰度值。我们希望通过图像复原算法来估计一个恢复的图像矩阵 X X X,大小也为 m × n m×n m×n。我们可以将图像复原看作是一个逆问题,其中观测数据是受损的图像矩阵 Y Y Y,而未知量是恢复的图像矩阵 X X X。我们假设受损图像 Y Y Y与恢复图像 X X X之间存在线性关系,可以用一个称为复原算子 H H H的矩阵来表示。那么,无约束最小乘方复原的目标是找到一个估计的恢复图像矩阵 X ∧ X^{\wedge} X,使得通过复原算子 H H H和估计的恢复图像矩阵 X ∧ X^{\wedge} X计算得到的预测图像矩阵 Y ∧ Y^{\wedge} Y与观测图像矩阵Y之间的平方误差最小。数学上可以表示为

X ∧ = argmin ⁡ ∥ Y − H X ∥ 2 X^{\wedge}=\operatorname{argmin}\|Y-H X\|^{2} X=argminYHX2

通过求解上述优化问题,我们可以得到估计的恢复图像矩阵 X ∧ X^{\wedge} X,它是使得平方误差最小的解。无约束最小乘方复原方法可基于正则化方法、优化算法等进行求解,以获得更好的复原效果

(2)约束复原

约束复原:附加某种约束条件,称为约束复原。有附加条件的极值问题可用拉格朗日乘数法来求解

  • 约束条件 ∥ n ∥ 2 = ∥ g − H f ^ ∥ 2 \|n\|^{2}=\|g-H \hat{f}\|^{2} n2=gHf^2
  • 准则函数 ∥ Q f ^ ∥ 2 \|Q \hat{f}\|^{2} Qf^2 Q Q Q为对原图像进行的某一线性运算
  • 拉格朗日函数 J ( f ^ ) = ∥ Q f ^ ∥ 2 + λ ( ∥ g − H f ^ ∥ 2 − ∥ n ∥ 2 ) J(\hat{f})=\|Q \hat{f}\|^{2}+\lambda\left(\|g-H \hat{f}\|^{2}-\|n\|^{2}\right) J(f^)=Qf^2+λ(gHf^2n2)
  • 求极小值 f ^ = ( H T H + 1 λ Q T Q ) − 1 H T g \hat{f}=\left(H^{T} H+\frac{1}{\lambda} Q^{T} Q\right)^{-1} H^{T} g f^=(HTH+λ1QTQ)1HTg

二:典型图像复原方法

(1)逆滤波复原

A:概述

逆滤波复原:是图像复原中一种常用的方法,旨在通过对图像进行频域上的逆滤波操作,恢复原始图像。假设我们有一个受损的图像表示为矩阵 Y Y Y,大小为 m × n m×n m×n,其中的元素表示像素灰度值。我们希望通过逆滤波复原算法来估计一个恢复的图像矩阵 X X X,大小也为 m × n m×n m×n。逆滤波复原的基本原理是假设图像受损是由于在频域上的卷积模糊操作所引起的。我们将这个模糊操作的效应表示为一个称为模糊核或点扩散函数(Point Spread Function,PSF)的矩阵,记作 H H H。那么,在频域上的逆滤波复原可以表示为以下数学表达式

  • F F F:离散傅里叶变换
  • F − 1 F^{-1} F1:离散傅里叶逆变换
  • F ( Y ) F(Y) F(Y) F ( H ) F(H) F(H)分别表示对图像矩阵 Y Y Y和模糊核矩阵 H H H进行离散傅里叶变换得到的频域表示

X ∧ = F − 1 F ( Y ) F ( H ) X^{\wedge}=F^{-1}\frac{F(Y)}{F(H)} X=F1F(H)F(Y)

在这个逆滤波复原公式中,我们将观测图像矩阵 Y Y Y和模糊核矩阵 H H H都转换到频域上,然后通过将它们的频域表示相除来进行逆滤波操作。最后,再将逆滤波后的结果通过离散傅里叶逆变换恢复到空域,得到估计的恢复图像矩阵 X ∧ X^{\wedge} X

B:程序

如下:对图像进行均值模糊,并进行逆滤波复原

在这里插入图片描述

在这里插入图片描述


matlab实现

clear,clc,close all;
Image=im2double(rgb2gray(imread('flower.jpg')));
window=15;
[n,m]=size(Image);
n=n+window-1;
m=m+window-1;
h=fspecial('average',window);
BlurI=conv2(h,Image);
BlurandnoiseI=imnoise(BlurI,'salt & pepper',0.001);
figure,imshow(Image),title('Original Image');
figure,imshow(BlurI),title('Blurred Image');
figure,imshow(BlurandnoiseI),title('Blurred Image with noise');
imwrite(BlurI,'Blurred.jpg');
imwrite(BlurandnoiseI,'blurrednoise.jpg');

h1=zeros(n,m);
h1(1:window,1:window)=h;
H=fftshift(fft2(h1));
H(abs(H)<0.0001)=0.01;
M=H.^(-1);
r1=floor(m/2);  r2=floor(n/2);d0=sqrt(m^2+n^2)/20;
for u=1:m
    for v=1:n
        d=sqrt((u-r1)^2+(v-r2)^2);
        if d>d0
            M(v,u)=0;
        end
    end
end

G1=fftshift(fft2(BlurI));
G2=fftshift(fft2(BlurandnoiseI));

f1=ifft2(ifftshift(G1./H));
f2=ifft2(ifftshift(G2./H));
f3=ifft2(ifftshift(G2.*M));

result1=f1(1:n-window+1,1:m-window+1);
result2=f2(1:n-window+1,1:m-window+1);
result3=f3(1:n-window+1,1:m-window+1);

figure,imshow(abs(result1),[]),title('Filtered Image1');
figure,imshow(abs(result2),[]),title('Filtered Image2');
figure,imshow(abs(result3),[]),title('Filtered Image3');

imwrite(abs(result1),'Filteredimage1.jpg');
imwrite(abs(result2),'Filteredimage2.jpg');
imwrite(abs(result3),'Filteredimage3.jpg');


% clear,clc;
% f=[1 1 1 1 1 1 1 1];
% h=[1 1 1];
% f1=[f 0 0];
% h1=[h 0 0 0 0 0 0 0];
% g1=conv(h,f);
% G1=fft(g1);
% H1=fft(h1);
% M=H1.^(-1);
% M(5:10)=0;
% F1=G1./H1;
% f2=ifft(F1);
% F2=G1.*M;
% f3=ifft(F2);

Python实现

import cv2
import numpy as np
import matplotlib.pyplot as plt

image = cv2.imread('flower.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = image.astype(np.float64) / 255.0

window = 15
n, m = image.shape
n = n + window - 1
m = m + window - 1

h = np.ones((window, window)) / window ** 2
blur_image = cv2.filter2D(image, -1, h)

blur_noise_image = np.copy(blur_image)
noise = np.random.rand(*blur_noise_image.shape)
salt_pepper = (noise < 0.001)
blur_noise_image[salt_pepper] = 0
blur_noise_image[~salt_pepper] = 1

plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.show()

plt.imshow(blur_image, cmap='gray')
plt.title('Blurred Image')
plt.show()

plt.imshow(blur_noise_image, cmap='gray')
plt.title('Blurred Image with Noise')
plt.show()

cv2.imwrite('Blurred.jpg', blur_image * 255)
cv2.imwrite('blurrednoise.jpg', blur_noise_image * 255)

h1 = np.zeros((n, m))
h1[:window, :window] = h
H = np.fft.fftshift(np.fft.fft2(h1))
H[np.abs(H) < 0.0001] = 0.01
M = np.power(H, -1)

r1 = m // 2
r2 = n // 2
d0 = np.sqrt(m ** 2 + n ** 2) / 20

for u in range(m):
    for v in range(n):
        d = np.sqrt((u - r1) ** 2 + (v - r2) ** 2)
        if d > d0:
            M[v, u] = 0

G1 = np.fft.fftshift(np.fft.fft2(blur_image))
G2 = np.fft.fftshift(np.fft.fft2(blur_noise_image))

f1 = np.fft.ifft2(np.fft.ifftshift(G1 / H))
f2 = np.fft.ifft2(np.fft.ifftshift(G2 / H))
f3 = np.fft.ifft2(np.fft.ifftshift(G2 * M))

result1 = np.abs(f1[:n-window+1, :m-window+1])
result2 = np.abs(f2[:n-window+1, :m-window+1])
result3 = np.abs(f3[:n-window+1, :m-window+1])

plt.imshow(result1, cmap='gray')
plt.title('Filtered Image 1')
plt.show()

plt.imshow(result2, cmap='gray')
plt.title('Filtered Image 2')
plt.show()

plt.imshow(result3, cmap='gray')
plt.title('Filtered Image 3')
plt.show()

cv2.imwrite('Filteredimage1.jpg', result1 * 255)
cv2.imwrite('Filteredimage2.jpg', result2 * 255)
cv2.imwrite('Filteredimage3.jpg', result3 * 255)

(2)维纳滤波复原

A:概述

维也纳滤波复原:是图像复原中一种常用的方法,旨在通过最小化估计图像与原始图像之间的均方误差,对受损图像进行恢复。假设我们有一个受损的图像表示为矩阵 Y Y Y,大小为 m × n m×n m×n,其中的元素表示像素灰度值。我们希望通过维纳滤波复原算法来估计一个恢复的图像矩阵 X X X,大小也为 m × n m×n m×n。维纳滤波复原的基本原理是将复原问题建模为信号的最小均方误差估计问题,通过估计图像与原始图像之间的信噪比以及受损图像与原始图像之间的频率响应之间的关系来进行复原。数学上,维纳滤波复原可以表示为以下表达式

  • X ∧ X^{\wedge} X:估计的恢复图像矩阵
  • Y Y Y:受损图像矩阵
  • F F F:离散傅里叶变换
  • F − 1 F^{-1} F1:离散傅里叶逆变换
  • H H H:系统的频率响应
  • S 2 S^{2} S2:原始图像的功率谱密度
  • N N N:噪声功率谱密度
    X ∧ = F − 1 [ H ∗ F ( Y ) H 2 + S 2 N ] X^{\wedge}=F^{-1}[H*\frac{F(Y)}{H^{2}+\frac{S^{2}}{N}}] X=F1[HH2+NS2F(Y)]

在这个表达式中,首先通过对受损图像矩阵Y进行离散傅里叶变换得到频域表示,然后将其与系统频率响应 H H H相除。这相当于对受损图像在频域上进行去卷积操作。然后,通过对去卷积结果除以噪声功率谱密度和原始图像的功率谱密度的比例,来校正估计图像的信噪比。最后,将校正后的频域结果通过离散傅里叶逆变换转换回空域,得到估计的恢复图像矩阵 X ∧ X^{\wedge} X

B:程序

如下:对运动模糊的图像进行维纳滤波

在这里插入图片描述

在这里插入图片描述


matlab实现

deconvwnr函数是MATLAB图像处理工具箱中用于维纳滤波复原的函数之一。它可以用于对受损图像进行复原,通过最小化估计图像与原始图像之间的均方误差,恢复原始图像。该函数的基本语法如下

J = deconvwnr(I, PSF, NSR)
  • I:受损图像。可以是灰度图像或彩色图像。
  • PSF:点扩散函数(Point Spread Function),即模糊核。可以是灰度图像、二维数组或函数句柄。PSF描述了图像受到的模糊效应。
  • NSR:信噪比(Noise-to-Signal Ratio),即受损图像的信噪比。通常使用估计的噪声方差除以信号方差来计算
clear,clc,close all;
Image=im2double(rgb2gray(imread('flower.jpg')));
subplot(221),imshow(Image),title('Original Image');
  
LEN=21;
THETA=11;
PSF=fspecial('motion', LEN, THETA);
BlurredI=imfilter(Image, PSF, 'conv', 'circular');

noise_mean = 0;
noise_var = 0.0001;
BlurandnoisyI=imnoise(BlurredI, 'gaussian', noise_mean, noise_var);
subplot(222), imshow(BlurandnoisyI),title('Simulate Blur and Noise');
imwrite(BlurandnoisyI,'sbn.jpg');

estimated_nsr = 0;
result1= deconvwnr(BlurandnoisyI, PSF, estimated_nsr);
subplot(223),imshow(result1),title('Restoration Using NSR = 0');
imwrite(result1,'runsr0.jpg');
 
estimated_nsr = noise_var / var(Image(:));
result2 = deconvwnr(BlurandnoisyI, PSF, estimated_nsr);
subplot(224),imshow(result2),title('Restoration Using Estimated NSR');
imwrite(result2,'ruensr.jpg');

Python实现

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取原始图像并转为灰度图像
image = cv2.imread('flower.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = image.astype(np.float64) / 255.0

# 显示原始图像
plt.subplot(221)
plt.imshow(image, cmap='gray')
plt.title('Original Image')

# 创建运动模糊核
LEN = 21
THETA = 11
PSF = cv2.getRotationMatrix2D((LEN/2, LEN/2), THETA, 1)
PSF = np.pad(PSF, ((0, LEN-PSF.shape[0]), (0, LEN-PSF.shape[1])), mode='constant', constant_values=0)

# 对原始图像进行模糊处理
blurred_image = cv2.filter2D(image, -1, PSF, borderType=cv2.BORDER_CONSTANT)

# 添加高斯噪声
noise_mean = 0
noise_var = 0.0001
blurred_noisy_image = blurred_image + np.random.normal(noise_mean, np.sqrt(noise_var), blurred_image.shape)

# 显示模拟的模糊和噪声图像
plt.subplot(222)
plt.imshow(blurred_noisy_image, cmap='gray')
plt.title('Simulated Blur and Noise')
plt.imsave('sbn.jpg', blurred_noisy_image, cmap='gray')

# 估计信噪比为0进行复原
estimated_nsr = 0
result1, _ = cv2.deconvolve(blurred_noisy_image, PSF)
result1 = np.clip(result1, 0, 1)

# 显示使用信噪比0进行复原的结果
plt.subplot(223)
plt.imshow(result1, cmap='gray')
plt.title('Restoration Using NSR = 0')
plt.imsave('runsr0.jpg', result1, cmap='gray')

# 估计信噪比并进行复原
estimated_nsr = noise_var / np.var(image)
result2, _ = cv2.deconvolve(blurred_noisy_image, PSF)
result2 = np.clip(result2, 0, 1)

# 显示使用估计的信噪比进行复原的结果
plt.subplot(224)
plt.imshow(result2, cmap='gray')
plt.title('Restoration Using Estimated NSR')
plt.imsave('ruensr.jpg', result2, cmap='gray')

# 显示图像
plt.show()

(3)等功率谱滤波

A:概述

等功率谱滤波:用于降低图像中的噪声或恢复受损的图像。等功率谱滤波的目标是在尽量保持图像的功率谱形状的前提下,减小噪声或修复图像。假设原始图像为 I ( x , y ) I(x, y) I(x,y),其中 ( x , y ) (x, y) (x,y)是图像中的像素坐标。我们可以将该图像的二维离散傅里叶变换(DFT)表示为 F ( u , v ) F(u, v) F(u,v),其中 ( u , v ) (u, v) (u,v)是频域中的频率坐标。等功率谱滤波的思想是,我们可以通过适当地缩放原始图像的频域表示来减小噪声或修复图像。具体而言,我们可以将频域表示 F ( u , v ) F(u, v) F(u,v)乘以一个滤波函数 H ( u , v ) H(u, v) H(u,v),以实现等功率谱滤波。滤波函数 H ( u , v ) H(u, v) H(u,v)用于控制不同频率成分的增益或衰减。其数学表达式如下, G ( u , v ) G(u,v) G(u,v)是经过等功率谱滤波后的频率表示

G ( u , v ) = F ( u , v ) ∗ H ( u , v ) G(u,v)=F(u,v)*H(u,v) G(u,v)=F(u,v)H(u,v)

为了满足等功率谱的条件,我们希望滤波函数 H ( u , v ) H(u, v) H(u,v)满足以下关系

∣ G ( u , v ) ∣ 2 ≈ ∣ F ( u , v ) ∣ 2 |G(u,v)|^{2} \approx |F(u,v)|^{2} G(u,v)2F(u,v)2

也即经过滤波后的频域表示的功率谱应接近原始频域表示的功率谱。这样可以保持图像的能量分布,减小噪声或修复受损的图像。然后,通过应用逆离散傅里叶变换(IDFT)将滤波后的频域表示 G ( u , v ) G(u, v) G(u,v)转换回空域表示,可以得到经过等功率谱滤波的图像

B:程序

如下:对运动模糊加噪声图像进行等功率谱滤波复原

在这里插入图片描述


matlab实现

clear,clc,close all;
Image=im2double(rgb2gray(imread('flower.jpg')));
[n,m]=size(Image);
figure,imshow(Image),title('Original Image');

LEN=21;
THETA=11;
PSF=fspecial('motion', LEN, THETA);
BlurredI=conv2(PSF,Image);
figure,imshow(BlurredI),title('motion blur');
imwrite(BlurredI,'motionblur.jpg');

[nh,mh]=size(PSF);
n=n+nh-1;
m=m+mh-1;
noise=imnoise(zeros(n,m),'salt & pepper',0.001);
BlurandnoiseI=BlurredI+noise;
figure,imshow(BlurandnoiseI),title('Blurred Image with noise');  
imwrite(BlurandnoiseI,'motionblurandnoise.jpg');

h1=zeros(n,m);
h1(1:nh,1:mh)=PSF;
H=fftshift(fft2(h1));
K=sum(noise(:).^2)/sum(Image(:).^2);
M=(1./(abs(H).^2+K)).^0.5;

G=fftshift(fft2(BlurandnoiseI));
f=ifft2(ifftshift(G.*M));
result=f(1:n-nh+1,1:m-mh+1);
figure,imshow(abs(result)),title('Filtered Image');
imwrite(abs(result),'denggonglvpuimage.jpg');

Python实现

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像并转为灰度图
image = cv2.imread('flower.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = image.astype(np.float64) / 255.0

# 显示原始图像
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.show()

LEN = 21
THETA = 11

# 创建运动模糊点扩散函数(PSF)
PSF = cv2.getMotionKernel(LEN, THETA)
PSF = PSF / np.sum(PSF)  # 归一化

# 进行运动模糊处理
blurred_image = cv2.filter2D(image, -1, PSF)

# 显示模糊图像
plt.imshow(blurred_image, cmap='gray')
plt.title('Motion Blur')
plt.show()

# 保存模糊图像
cv2.imwrite('motionblur.jpg', blurred_image * 255.0)

nh, mh = PSF.shape
n, m = image.shape
n = n + nh - 1
m = m + mh - 1

# 添加椒盐噪声
noise = np.random.rand(n, m)
noise = np.where(noise < 0.001, 1, 0)
blurred_noisy_image = blurred_image + noise

# 显示带噪声的模糊图像
plt.imshow(blurred_noisy_image, cmap='gray')
plt.title('Blurred Image with Noise')
plt.show()

# 保存带噪声的模糊图像
cv2.imwrite('motionblurandnoise.jpg', blurred_noisy_image * 255.0)

h1 = np.zeros((n, m))
h1[0:nh, 0:mh] = PSF

# 计算滤波器的频域表示
H = np.fft.fftshift(np.fft.fft2(h1))

# 计算噪声方差和信号方差的比例
K = np.sum(noise**2) / np.sum(image**2)

# 计算等功率谱滤波器
M = (1.0 / (np.abs(H)**2 + K))**0.5

# 对带噪声的模糊图像进行频域滤波
G = np.fft.fftshift(np.fft.fft2(blurred_noisy_image))
f = np.fft.ifft2(np.fft.ifftshift(G * M))

# 提取滤波结果的有效区域
result = np.abs(f[0:n-nh+1, 0:m-mh+1])

# 显示滤波后的图像
plt.imshow(result, cmap='gray')
plt.title('Filtered Image')
plt.show()

# 保存滤波后的图像
cv2.imwrite('denggonglvpuimage.jpg', result * 255.0)

(4)几何均值滤波

集合均值滤波:在图像复原中,几何均值滤波是一种常用的滤波方法,用于降低图像中的噪声或改善图像质量。几何均值滤波的主要思想是通过计算像素周围邻域的几何平均值来平滑图像,从而抑制噪声并保留图像的边缘信息。假设原始图像为 I ( x , y ) I(x, y) I(x,y),其中( ( x , y ) (x,y) (x,y)是图像中的像素坐标。几何均值滤波器的邻域大小为 n × n n×n n×n,以中心像素为基准,我们可以定义一个邻域矩阵为 N ( x , y N(x, y N(x,y。几何均值滤波的计算步骤如下

  • 对于图像中的每个像素点 ( x , y ) (x, y) (x,y),将邻域矩阵 N ( x , y ) N(x, y) N(x,y)中的所有像素值相乘得到乘积 P P P。也即 P = ∏ N ( i , j ) P=\prod N(i,j) P=N(i,j)
  • 计算领域矩阵 N ( x , y ) N(x,y) N(x,y)中像素值的几何平均值 A A A A = P 1 n 2 A=P^{\frac{1}{n^{2}}} A=Pn21
  • 将几何平均值 A A A作为滤波后的像素值,用于替换原始图像中的像素值 I ( x , y ) I(x, y) I(x,y)

几何均值滤波通过计算像素周围邻域的几何平均值来实现平滑处理。由于几何平均值对噪声像素具有较强的抑制作用,因此几何均值滤波常用于去除椒盐噪声等图像中的随机噪声。它能够保持图像的整体亮度和结构特征,但可能导致图像细节的模糊。因此,在应用几何均值滤波时需要权衡噪声抑制和细节保留之间的平衡

(5)约束最小二乘法滤波

A:概述

约束最小二乘法滤波:图像复原中的约束最小二乘方滤波是一种常用的滤波方法,用于恢复受损的图像。该方法基于最小二乘方准则,通过约束滤波器的响应以尽量满足先验信息和图像特性,从而减小噪声和估计图像的失真。假设原始图像为 I ( x , y ) I(x, y) I(x,y),其中 ( x , y ) (x, y) (x,y)是图像中的像素坐标。我们的目标是通过滤波操作来估计原始图像。首先,我们引入一个约束函数 C C C,用于限制滤波器的响应。约束函数 C C C可以是对滤波器的频率响应进行限制的函数,例如限制滤波器的幅度响应或相位响应。滤波器的频率响应为 H ( u , v ) H(u, v) H(u,v),其中 ( u , v ) (u, v) (u,v)是频率域中的频率坐标。通过应用约束函数 C C C,我们可以得到约束后的滤波器响应

H c ( u , v ) = C [ H ( u , v ) ] H_{c}(u,v)=C[H(u,v)] Hc(u,v)=C[H(u,v)]
然后,我们通过最小化以下约束最小二乘方问题来估计滤波后的图像

arg ⁡ min ⁡ F ∑ ∑ ∣ G ( u , v ) − F ( u , v ) ⋅ H c ( u , v ) ∣ 2 \arg \min _{F} \sum \sum\left|G(u, v)-F(u, v) \cdot H_{c}(u, v)\right|^{2} argFmin∑∑G(u,v)F(u,v)Hc(u,v)2

其中, G ( u , v ) G(u, v) G(u,v)是受损图像的频率表示, F ( u , v ) F(u, v) F(u,v)是滤波后的图像的频率表示。约束最小二乘方滤波的目标是找到滤波后的图像 F ( u , v ) F(u, v) F(u,v),使得滤波后的图像与受损图像之间的差异最小。最小二乘方问题的解可以通过将其转化为频率域中的点对点相除来获得

F ( u , v ) = G ( u , v ) H c ( u , v ) F(u,v)=\frac{G(u,v)}{H_{c}(u,v)} F(u,v)=Hc(u,v)G(u,v)

通过将滤波后的图像的频率表示 F ( u , v ) F(u, v) F(u,v)转换回空域表示,可以得到估计的复原图像

B:程序

如下:对模糊的图像进行约束最小二乘方滤波

在这里插入图片描述

在这里插入图片描述


matlab实现

deconvreg函数用于执行正则化盲去卷积(regularized blind deconvolution)操作。这个函数可以用于估计图像的退化过程(如模糊或噪声)并恢复原始图像。其语法格式如下

[J, LAMBDA] = deconvreg(I, PSF, K)
[J, LAMBDA] = deconvreg(I, PSF, K, OPTIONS)

输入参数

  • I:观测图像,即受退化影响的图像。
  • PSF:点扩散函数(Point Spread Function),表示退化过程中的模糊过程。
  • K:正则化参数,用于平衡图像恢复和噪声增强之间的权衡

可选参数

  • OPTIONS:一个结构体,包含额外的选项设置,如迭代次数、停止准则等

输出参数

  • J:恢复的图像,即通过盲去卷积估计得到的原始图像。
  • LAMBDA:正则化参数的最佳值,用于平衡去卷积和噪声增强
clear,clc,close all;
Image=im2double(rgb2gray(imread('flower.jpg')));
window=15;
[N,M]=size(Image);
N=N+window-1;
M=M+window-1;
h=fspecial('average',window);
BlurI=conv2(h,Image);
sigma=0.001;
miun=0;
nn=M*N*(sigma+miun*miun);
BlurandnoiseI=imnoise(BlurI,'gaussian',miun,sigma);
figure,imshow(BlurandnoiseI),title('Blurred Image with noise');
imwrite(BlurandnoiseI,'Blurrednoiseimage.jpg');

h1=zeros(N,M);
h1(1:window,1:window)=h;
H=fftshift(fft2(h1));

lap=[0 1 0;1 -4 1;0 1 0];
L=zeros(N,M);
L(1:3,1:3)=lap;
L=fftshift(fft2(L));

G=fftshift(fft2(BlurandnoiseI));
gama=0.3;
step=0.01;
alpha=nn*0.001;
flag=true;
while flag 
    MH=conj(H)./(abs(H).^2+gama*(abs(L).^2));
    F=G.*MH;
    E=G-H.*F;
    E=abs(ifft2(ifftshift(E)));
    ee=sum(E(:).^2);
    if ee<nn-alpha
        gama=gama+step;
    elseif ee>nn+alpha
        gama=gama-step;
    else
        flag=false;
    end
end
MH=conj(H)./(abs(H).^2+gama*(abs(L).^2));
f=ifft2(ifftshift(G.*MH));
result=f(1:N-window+1,1:M-window+1);
[J, LAGRA]=deconvreg(BlurandnoiseI,h,nn);
figure,imshow(J,[]);

figure,imshow(abs(result),[]),title('Filtered Image');
imwrite(abs(result),'LSFilteredimage.jpg');



python实现

import cv2
import numpy as np
import matplotlib.pyplot as plt

image = cv2.imread('flower.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = image.astype(np.float64) / 255.0

window = 15
N, M = image.shape
N = N + window - 1
M = M + window - 1

h = cv2.getGaussianKernel(window, 0)
h1 = np.zeros((N, M))
h1[:window, :window] = h

BlurI = cv2.filter2D(image, -1, h)
sigma = 0.001
miun = 0
nn = M * N * (sigma + miun * miun)

BlurandnoiseI = cv2.randn(BlurI, miun, sigma)
BlurandnoiseI = BlurandnoiseI.astype(np.float64) / 255.0

plt.imshow(BlurandnoiseI, cmap='gray')
plt.title('Blurred Image with noise')
plt.show()

H = np.fft.fftshift(np.fft.fft2(h1))

lap = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]])
L = np.zeros((N, M))
L[:3, :3] = lap
L = np.fft.fftshift(np.fft.fft2(L))

G = np.fft.fftshift(np.fft.fft2(BlurandnoiseI))
gama = 0.3
step = 0.01
alpha = nn * 0.001
flag = True

while flag:
    MH = np.conj(H) / (np.abs(H) ** 2 + gama * (np.abs(L) ** 2))
    F = G * MH
    E = G - H * F
    E = np.abs(np.fft.ifft2(np.fft.ifftshift(E)))
    ee = np.sum(E ** 2)

    if ee < nn - alpha:
        gama = gama + step
    elif ee > nn + alpha:
        gama = gama - step
    else:
        flag = False

MH = np.conj(H) / (np.abs(H) ** 2 + gama * (np.abs(L) ** 2))
f = np.fft.ifft2(np.fft.ifftshift(G * MH))
result = f[:N-window+1, :M-window+1]

plt.imshow(np.abs(result), cmap='gray')
plt.title('Filtered Image')
plt.show()

(6)Richardson-Lucy算法

A:概述

Richardson-Lucy算法:RL算法是一种迭代盲去卷积算法,用于图像复原。它被广泛用于恢复被模糊和受损的图像。假设我们有一个受模糊和受损的图像 I I I,我们的目标是估计原始图像 J J J,其中 J J J是我们要恢复的图像。首先,我们定义一个点扩散函数(Point Spread Function)H,表示模糊过程中的系统响应。RL算法迭代步骤如下

  • 初始化:将估计的图像J初始化为与输入图像I相同的值或使用其他合适的初始化方法。
  • 步骤一:计算反卷积因子D。这可以通过将输入图像I与估计的图像J进行卷积来得到,即 D = I ⊗ J。
  • 步骤二:计算更新系数E。这可以通过将反卷积因子D与模糊函数H进行卷积来得到,即 E = D ⊗ H。
  • 步骤三:计算更新的图像估计J’。这可以通过将估计的图像J与更新系数E逐元素相除来得到,即 J’ = J ⊘ E
  • 重复步骤二和步骤三,直到满足停止准则(例如达到最大迭代次数或估计的图像收敛)

B:程序

如下:对模糊的图像进行RL算法复原

在这里插入图片描述


matlab实现

deconvlucy函数是用于执行Lucy-Richardson算法的函数。Lucy-Richardson算法是一种迭代盲去卷积算法,用于图像复原。其语法格式如下

[J, PSF] = deconvlucy(I, PSF, NUMIT)
[J, PSF] = deconvlucy(I, PSF, NUMIT, DAMPAR)
[J, PSF] = deconvlucy(I, PSF, NUMIT, DAMPAR, INITPSF)
[J, PSF] = deconvlucy(I, PSF, NUMIT, DAMPAR, INITPSF, OPTIONS)

输入参数:

  • I:观测图像,即受退化影响的图像。
  • PSF:点扩散函数(Point Spread Function),表示退化过程中的模糊过程。
  • NUMIT:迭代次数,指定Lucy-Richardson算法的迭代次数。

可选参数:

  • DAMPAR:阻尼参数(Damping Parameter),用于控制算法的收敛性和稳定性。
  • INITPSF:初始化的点扩散函数,用于改进算法的初始估计。
  • OPTIONS:一个结构体,包含其他选项设置,如停止准则、正则化等。

输出参数:

  • J:恢复的图像,即通过Lucy-Richardson算法估计得到的原始图像。
  • PSF:估计的点扩散函数
clear,clc,close all;
I=im2double(rgb2gray(imread('flower.jpg')));
figure,imshow(I),title('原图像');
PSF=fspecial('gaussian',7,10);%产生一个高斯低通滤波器,模板尺寸为[7 7],滤波器的标准差为10
V=0.0001;%高斯加性噪声的标准差
IF1=imfilter(I,PSF);%原图像通过高斯低通滤波器
BlurredNoisy=imnoise(IF1,'gaussian',0,V);%加入高斯噪声
figure,imshow(BlurredNoisy),title('高斯模糊加噪声图像');

WT=zeros(size(I));%产生权重矩阵
WT(5:end-1,5:end-4)=1;

%使用不同的参数进行复原
J1=deconvlucy(BlurredNoisy,PSF);
J2=deconvlucy(BlurredNoisy,PSF,50,sqrt(V));
J3=deconvlucy(BlurredNoisy,PSF,100,sqrt(V),WT);

figure,imshow(J1),title('10次迭代');
figure,imshow(J2),title('50次迭代');
figure,imshow(J3),title('100次迭代');

python实现

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
I = cv2.imread('flower.jpg')
I = cv2.cvtColor(I, cv2.COLOR_BGR2GRAY)
I = I.astype(np.float64) / 255.0

# 显示原图像
plt.imshow(I, cmap='gray')
plt.title('原图像')
plt.show()

# 创建高斯低通滤波器
PSF = cv2.getGaussianKernel(7, 10)
PSF = np.outer(PSF, PSF)

# 添加高斯噪声
V = 0.0001
IF1 = cv2.filter2D(I, -1, PSF)
BlurredNoisy = cv2.randn(IF1, 0, V)
BlurredNoisy = cv2.add(IF1, BlurredNoisy)

# 显示高斯模糊加噪声图像
plt.imshow(BlurredNoisy, cmap='gray')
plt.title('高斯模糊加噪声图像')
plt.show()

# 创建权重矩阵
WT = np.zeros_like(I)
WT[4:, 4:-3] = 1

# 使用不同参数进行复原
J1 = cv2.deconvolve(BlurredNoisy, PSF)[0]
J2 = cv2.deconvolve(BlurredNoisy, PSF, iterations=50)[0]
J3 = cv2.deconvolve(BlurredNoisy, PSF, iterations=100, reg=np.sqrt(V), weight=WT)[0]

# 显示复原结果
plt.imshow(J1, cmap='gray')
plt.title('10次迭代')
plt.show()

plt.imshow(J2, cmap='gray')
plt.title('50次迭代')
plt.show()

plt.imshow(J3, cmap='gray')
plt.title('100次迭代')
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/532397.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】负数取模、取余

文章目录 一. 关于“取整”1. 向0取整2. 向负无穷取整3. 向正无穷取整4. 四舍五入式的取整 二. 关于“取模”的本质三. 取余和取模的区别 一. 关于“取整” 首先谈谈关于数学取整的问题 1. 向0取整 C中的除法和取整规则都是向0取整&#xff0c;即所有小数都向 0 的方向取整&…

第四十一天学习记录:C语言进阶:笔试题整理Ⅱ

喝汽水问题&#xff1a;1瓶汽水1元&#xff0c;2个空瓶可以换一瓶汽水&#xff0c;输入价钱&#xff0c;可以喝多少汽水。&#xff08;编程实现&#xff09; #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>int main() {int money 0;int total 0;int empty 0;s…

手把手教配置vsc中的c\c++环境

为了防止你之前所看vsc配置C\C视频或者教学不成功的残留影响&#xff0c;这边开始会对vsc进行一次卸载和删除缓存 打开控制面板--点击程序--点击卸载--卸载vsc 显示效果如下 点击是 上面三部完成vsc卸载&#xff0c;接下完成残留卸载 打开你的c盘&#xff0c;如图 点击进去&…

Vue3-黑马(十四)

目录&#xff1a; &#xff08;1&#xff09;vue3-进阶-router-令牌-前端路由 &#xff08;2&#xff09;vue3-进阶-router-令牌-前端路由 &#xff08;3&#xff09;vue3-进阶-pinia1 &#xff08;4&#xff09;vue3-进阶-pinia2 &#xff08;1&#xff09;vue3-进阶-rout…

vite3+vue3 项目打包优化

现在很多小伙伴都已经使用 Vite Vue3 开发项目了&#xff0c;如果你是 “前端架构师” 或者是 “团队核心” 的话&#xff0c;不得不可考虑的一个问题就是性能优化。 说到前端性能优化&#xff0c;个人认为主要有两个方面&#xff1a; 减少文件的体积&#xff0c;体积小了加载…

SIEM日志管理解决方案

如果管理员想知道管理的网络中发生了什么&#xff0c;以便洞察潜在的威胁并在它们变成攻击之前阻止它们&#xff0c;那么管理员需要查看网络日志。企业网络中的设备如路由器、交换机、防火墙、服务器&#xff0c;业务运行的应用程序&#xff0c;如数据库和web服务器等。所有这些…

SpringBoot核心运行原理解析之-------@EnableAutoConfiguration

核心运行原理 我们通常在使用Spring Boot时&#xff0c;只需要引入对应的starters,Spring Boot启动时变回自动加载相关依赖&#xff0c;配置相应的初始化参数&#xff0c;以最快捷&#xff0c;简单的形式对第三方软件进行集成&#xff0c;这边是Spring Boot的自动配置功能。下…

【服务器数据恢复】EMC NAS中的虚拟机数据恢复案例

服务器数据恢复环境&#xff1a; 北京某公司的EMC NAS&#xff0c;总共有3个节点&#xff0c;每个节点配置12块STAT硬盘。 NAS中存放有vmware虚拟机&#xff08;WEB 服务器&#xff09;和视频文件。 虚拟机通过NFS协议共享到ESX主机&#xff0c;视频文件通过CIFS协议共享给虚拟…

Scala字符串常用函数

Scala字符串常用函数 1. 子字符串-substring2. 字符串切分-split3. 去掉首尾空格-trim4. 与数值之间的转换完整代码参考链接 Scala中的字符串为String类型&#xff0c;其实就是Java中的java.lang.String。其常用函数如下&#xff1a; 1. 子字符串-substring substring()方法返…

AUTOSAR NvM 同步机制

一、部分 NvM API 解释 &#xff08;1&#xff09;Std_ReturnType NvM_ReadBlock(NvM_BlockIdType BlockId,void* NvM_DstPtr) 把Nv Block中的数据copy到NvM_DstPtr指向的RAM中&#xff0c;NvM_DstPtr可以是临时RAM&#xff0c;也可以是永久RAM&#xff08;永久RAM即配置工具…

自动化、智能、机器人-2023-

文明&#xff1a;农业、工业、信息、智能&#xff0c;以目前认知的四个阶段。 农业文明到工业文明&#xff1a;机械自动化 工业文明到信息文明&#xff1a;电气自动化 信息文明到智能文明&#xff1a;数据自动化 这些时代典型的机器人&#xff1a; 机械自动化 电气自动化 数…

Mini_Web开发

文章目录 服务器开发回顾面向对象服务端客户端&#xff08;浏览器&#xff09;请求数据处理判断不同的请求路径&#xff0c;返回不同的数据给前端 单独封装方法不同请求路径处理的方法再次拆分业务封装JSON数据处理 Mini_Web开发导入数据使用Python操作数据库使用pymysql模块日…

瑞吉外卖 - 编辑员工信息功能(9)

某马瑞吉外卖单体架构项目完整开发文档&#xff0c;基于 Spring Boot 2.7.11 JDK 11。预计 5 月 20 日前更新完成&#xff0c;有需要的胖友记得一键三连&#xff0c;关注主页 “瑞吉外卖” 专栏获取最新文章。 相关资料&#xff1a;https://pan.baidu.com/s/1rO1Vytcp67mcw-PD…

238:vue+openlayers绘制扩展,弓形、曲线、扇形、双箭头、进攻方向...

第238个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中利用ol-plot插件进行绘制图形扩展,可以绘制弓形、弧形、标志旗、战斗进攻图形等等。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果OpenStreetMap无法加载,请加载其他…

win11 下部署Vicuna-7B,Vicuna-13B模型,

运行Vicuna-7B需要RAM>30GB或者14GB的显存 运行Vicuna-13B需要RAM>60GB或者28GB的显存 如果没有上面的硬件配置请绕行了&#xff0c;我笔记本有64G内存&#xff0c;两个都跑跑看&#xff0c;使用python3.9&#xff0c;当时转换13b时一直崩溃后来发现是没有设定虚拟内存&…

Linux指令 快捷键

热键 上一次我们说到了linux的基本指令&#xff0c;这次我们先说一下热键 TAB TAB键在linux中有什么作用呢&#xff1f;&#xff1f; 在Linux中&#xff0c;假设我们想要输入的指令忘记了&#xff0c;我们可以TAB两下&#xff0c;帮我们补全命令或者假如命令太多&#xff0…

C++基础STL-set容器

set容器介绍&#xff1a; set译为集合&#xff0c;集合是按照特定顺序存储唯一元素的容器。在集合中&#xff0c;元素的值也标识它(值本身就是键&#xff0c;类型为T)&#xff0c;并且每个值必须是唯一的。集合中元素的值在容器中一次就不能修改(元素总是const)&#xff0c;但可…

python学习环境准备

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言本专栏文章旨在记录《Python编程从入门到实践》一书的学习笔记。 一、编程环境二、使用步骤1.修改默认python版本2.终端退出python解释器3.编写.py文件4.运行.p…

【Linux是如何发送网络包的?】

网络模型 为了使得多种设备能通过网络相互通信&#xff0c;和为了解决各种不同设备在网络互联中的兼容性问题&#xff0c;国际标准化组织制定了开放式系统互联通信参考模型&#xff08;Open System Interconnection Reference Model&#xff09;&#xff0c;也就是 OSI 网络模…

【工作中掌握10个就够了!!!】Linux中的10个最常见命令+vim三个基本操作

欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#xff1a;重难点★✔ 蓝色文字表示&#…