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

news/2024/12/26 20:25:13/

文章目录

  • 一:盲去卷积复原
    • (1)概述
    • (2)程序
  • 二:几何失真校正
    • (1)概述
    • (2)程序

一:盲去卷积复原

(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:初始点扩散函数的估计。

返回值:

  • 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()

http://www.ppmy.cn/news/73146.html

相关文章

使用C51单片机实现红外遥控行为控制

目录 引言 红外遥控原理 实现红外遥控功能 代码示例 结论 实现红外遥控接收功能 综合应用 总结 引言 红外遥控技术广泛应用于我们日常生活的各个方面,如家电控制等。在此篇文章中,我们将会详细解析如何使用C51单片机来实现红外遥控功能。我们会…

史上最全类和对象 ,只要你认真看完C++类和对象,分分钟钟都吊打面试官【 C++】

文章目录 基础篇面向过程和面向对象类的引入类的定义类的访问限定符类的封装类的作用域类的实例化类对象模型如何计算类对象的大小类对象的存储方式猜测对象中包含类的各个成员代码只保存一份,在对象中保存存放代码的地址只保存成员变量,成员函数存放在公…

基于html+css的图展示77

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

TCL表达式

目录 操作数 运算符和优先级 数学函数 操作数 TCL 表达式的操作数通常是整数或实数。整数一般是十进制的, 但如果整数的第一个字符是 0(zero),那么 TCL 将把这个整数看作八进制的,如果前两个字符是 0x 则这个整数被看作是十 六进制的。TC…

【连续介质力学】张量值张量函数

张量值张量函数 张量值张量函数有以下类型:标量,向量和高阶张量 标量值张量函数: Ψ Ψ ( T ) det ⁡ T Ψ Ψ ( T , S ) T : S \Psi \Psi(T) \det T \\ \Psi \Psi(T,S) T:S ΨΨ(T)detTΨΨ(T,S)T:S 其中, T , S T, S …

SHELL——流程控制条件判断

1、判断当前磁盘剩余空间是否有20G,如果小于20G,则将报警邮件发送给管理员,每天检查一次磁盘剩余空间。 2、判断web服务是否运行 1)、查看进程的方式判断该程序是否运行 2)、通过查看端口的方式判断该程序是否运行&am…

Istio virtual service 超时和重试

在使用xshell去远程连接服务器的时候没有反应,这样可能等了几分钟,这样按下crtlc终止就行了。 有些时候微服务是多个服务组成的,a服务会去调用b服务,可能因为网络问题或者连接问题,没有连接成功,那么会尝试…

设计原则-单一职责原则

在编程大环境中,评价代码组织方式质量的好坏涉及到各个方面,如代码的可读性、可维护性、可复用性、稳定性等各个方面。而在面向对象语言中也可以通过以下各个方面: 类中方法的设计类中属性的设计类(接口、抽象类、普通类)的设计类与类之间的…