(数字图像处理MATLAB+Python)第八章图像复原-第五、六节:盲去卷积复原和几何失真校正

一:盲去卷积复原

(1)概述

盲去卷积复原:当我们考虑图像复原中的盲去卷积复原时,我们可以使用以下数学符号和方程来描述该问题

  • 原始图像:我们用I表示原始图像,其中I是一个二维离散函数。 I ( x , y ) I(x, y) I(x,y)表示在坐标 ( x , y ) (x, y) (x,y)处的图像强度值
  • 模糊核:我们用 H H H表示未知的模糊核或点扩散函数,它是导致图像模糊的原因。 H ( u , v ) H(u, v) H(u,v)表示在频域中的模糊核值,其中 ( u , v ) (u, v) (u,v)是频域的坐标
  • 模糊图像:我们用 B B B表示经过模糊处理后的图像,也称为模糊图像。 B ( x , y ) B(x, y) B(x,y)表示在坐标 ( x , y ) (x, y) (x,y)处的模糊图像强度值
  • 目标:我们的目标是恢复原始图像 I I I

在盲去卷积复原中,我们首先需要估计模糊核 H H H,然后将其应用于模糊图像 B B B来恢复原始图像 I I I

  • 估计模糊核:通过观察已知的模糊图像 B B B和未知的原始图像 I I I之间的关系,我们可以使用各种方法估计模糊核 H H H。这可以表示为以下方程: B ( x , y ) = I ( x , y ) ⊗ H ( x , y ) B(x, y)=I(x, y) \otimes H(x, y) B(x,y)=I(x,y)H(x,y)
  • 恢复原始图像:一旦模糊核H被估计出来,我们可以将其应用于模糊图像B来恢复原始图像 I I I。这可以表示为以下方程: I ( x , y ) = B ( x , y ) ⊗ H − 1 ( x , y ) I(x,y)=B(x,y)\otimes H^{-1}(x,y) I(x,y)=B(x,y)H1(x,y)

通过解决上述方程,我们可以实现盲去卷积复原,以尽可能准确地恢复原始图像I。然而,实际中由于噪声和估计误差等因素,盲去卷积复原可能会面临挑战,并且需要使用其他技术和算法进行辅助处理和改进

(2)程序

如下:对模糊的图像进行最大似然估计盲复原滤波

在这里插入图片描述


matlab实现

deconvblind函数是一个用于盲去卷积复原的函数。它可以用于从经过模糊和噪声处理的图像中恢复原始图像,并尽可能估计出导致图像模糊的未知点扩散函数(PSF)。其语法格式如下

[J, P] = deconvblind(A, PSF, NUMIT, DAMPAR, WEPS, INITPSF)

参数说明:

  • A:经过模糊和噪声处理的图像。
  • PSF:初始点扩散函数的估计。
  • NUMIT:迭代次数,控制算法的收敛速度。
  • DAMPAR:阻尼参数,用于控制正则化项的权重,以平衡去卷积和约束条件。
  • WEPS:权重阈值,用于确定权重矩阵中的非零元素。
  • INITPSF:初始点扩散函数的估计。

返回值:

扫描二维码关注公众号,回复: 17010929 查看本文章
  • J:复原的图像。
  • P:估计的点扩散函数
clear,clc,close all;
I=im2double(rgb2gray(imread('flower.jpg')));
PSF=fspecial('gaussian',7,10);%产生一个高斯低通滤波器,模板尺寸为[7 7],滤波器的标准差为10
V=0.0001;%高斯加性噪声的标准差
IF1=imfilter(I,PSF);%原图像通过高斯低通滤波器
BlurredNoisy=imnoise(IF1,'gaussian',0,V);%加入高斯噪声
WT = zeros(size(I));WT(5:end-4,5:end-4) = 1;
INITPSF = ones(size(PSF));
[J,P] = deconvblind(BlurredNoisy,INITPSF,20,10*sqrt(V),WT);
subplot(221),imshow(BlurredNoisy),title('高斯模糊加噪声图像');
subplot(222),imshow(PSF,[]),title('True PSF');
subplot(223),imshow(J),title('Deblurred Image');
subplot(224),imshow(P,[]),title('Recovered PSF');
imwrite(J,'DeblurredI.jpg');


Python实现

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

# 读取图像
image = cv2.imread('flower.jpg')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
I = cv2.normalize(gray_image.astype('float'), None, 0.0, 1.0, cv2.NORM_MINMAX)

# 生成高斯模糊核
PSF = cv2.getGaussianKernel(7, 10) * cv2.getGaussianKernel(7, 10).T

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

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

# 初始化PSF
INITPSF = np.ones_like(PSF)

# 盲去卷积复原
J, P = cv2.deconvblind(BlurredNoisy, INITPSF, 20, 10 * np.sqrt(V), WT)

# 显示结果
plt.subplot(221), plt.imshow(BlurredNoisy, cmap='gray')
plt.title('高斯模糊加噪声图像')
plt.subplot(222), plt.imshow(PSF, cmap='gray')
plt.title('True PSF')
plt.subplot(223), plt.imshow(J, cmap='gray')
plt.title('Deblurred Image')
plt.subplot(224), plt.imshow(P, cmap='gray')
plt.title('Recovered PSF')
plt.savefig('DeblurredI.jpg')
plt.show()

二:几何失真校正

(1)概述

几何失真校正:是一种用于纠正图像中的几何畸变的技术。几何畸变可以由多种因素引起,例如摄像机透视、镜头畸变等。几何失真校正的目标是恢复图像的几何形状和比例,使其更接近于原始场景。在几何失真校正中,我们可以使用以下数学符号和方程来描述该问题

  • 原始图像:我们用 I I I表示原始图像,其中I是一个二维离散函数。 I ( x , y ) I(x, y) I(x,y)表示在坐标 ( x , y ) (x, y) (x,y)处的图像强度值
  • 失真模型:我们假设存在一个失真模型,将原始图像中的每个像素映射到校正后的图像中的新位置。这个映射关系可以表示为一个函数,如 F ( x , y ) F(x, y) F(x,y)
  • 校正图像:我们用 C C C表示校正后的图像,其中 C C C是一个二维离散函数。 C ( x , y ) C(x, y) C(x,y)表示在校正后的图像中坐标 ( x , y ) (x, y) (x,y)处的图像强度值
  • 逆变换:为了进行几何失真校正,我们需要找到失真模型的逆变换,将校正后的图像中的像素映射回原始图像的位置。这个逆变换可以表示为函数 F − 1 ( x , y ) F^{-1}(x,y) F1(x,y)
  • 校正过程:校正过程涉及将原始图像中的每个像素根据失真模型的逆变换映射到校正后的图像中的新位置,以获得校正后的图像C。这可以表示为以下方程: C ( x , y ) = I ( F − 1 ( x , y ) ) C(x,y)=I(F^{-1}(x,y)) C(x,y)=I(F1(x,y))

通过解决上述方程,我们可以实现几何失真校正,将校正后的图像中的像素重新映射回原始图像的位置,从而恢复图像的几何形状和比例

(2)程序

如下

在这里插入图片描述


matlab实现

clear,clc,close;
Image=im2double(imread('lotus.jpg'));
[h,w,c]=size(Image);
figure,imshow(Image),title('原图');
RI=imrotate(Image,20);
tform=maketform('affine',[1 0.5 0;0.5 1 0; 0 0 1]);
NewImage=imtransform(RI,tform);
figure,imshow(NewImage),title('几何畸变的图像');
imwrite(NewImage,'GDImage.jpg'); 
cpselect(NewImage,Image);
input_points=[709 577;409 270;320 370];
base_points=[487 305;374 41;134 159];
tform=cp2tform(input_points,base_points,'affine');
result=imtransform(NewImage,tform,'XData',[1 w],'YData',[1 h]);
figure,imshow(result),title('校正后的图像');
imwrite(result,'jiaozheng.jpg');

python实现

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

# 读取图像
image = cv2.imread('lotus.jpg')
Image = cv2.normalize(image.astype('float'), None, 0.0, 1.0, cv2.NORM_MINMAX)

# 显示原始图像
plt.figure()
plt.imshow(Image)
plt.title('原图')

# 旋转图像
RI = cv2.rotate(Image, cv2.ROTATE_90_CLOCKWISE)

# 创建仿射变换矩阵
tform = np.array([[1, 0.5, 0], [0.5, 1, 0], [0, 0, 1]])

# 进行几何畸变
NewImage = cv2.warpPerspective(RI, tform, (RI.shape[1], RI.shape[0]))

# 显示几何畸变的图像
plt.figure()
plt.imshow(NewImage)
plt.title('几何畸变的图像')
plt.savefig('GDImage.jpg')

# 特征点对应
input_points = np.array([[709, 577], [409, 270], [320, 370]], dtype=np.float32)
base_points = np.array([[487, 305], [374, 41], [134, 159]], dtype=np.float32)

# 计算仿射变换矩阵
tform = cv2.getAffineTransform(input_points, base_points)

# 进行校正
result = cv2.warpAffine(NewImage, tform, (Image.shape[1], Image.shape[0]))

# 显示校正后的图像
plt.figure()
plt.imshow(result)
plt.title('校正后的图像')
plt.savefig('jiaozheng.jpg')

plt.show()

猜你喜欢

转载自blog.csdn.net/qq_39183034/article/details/130742734