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

news/2024/4/21 0:01:15/

文章目录

  • 一:盲去卷积复原
    • (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服务,可能因为网络问题或者连接问题,没有连接成功,那么会尝试…

设计原则-单一职责原则

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

百万数据慢慢读?Pandas性能优化法速读百万级数据无压力

作为数据分析工作者,我们每天都要处理大量数据,这时Pandas等工具的读取性能也就备受关注。特别是当数据集达到百万行以上时,如何提高读取效率,让数据分析工作跑上“快车道”?本文将详细分析Pandas读取大数据的性能优化方法,以及一些建议和经验。 1. 使用SQL进行预处理 可以通…

docker和 GPUsQA:could not select device driver “” with capabilities: [[gpu]].

文章目录 could not select device driver “” with capabilities: [[gpu]].解决办法需要安装:nvidia-container-toolkit参考could not select device driver “” with capabilities: [[gpu]]. 问题描述:GPU服务器安装了docker 版本大于19.03,拉取tensorflow官方镜像无法识别…

​从底层技术分析如何调教你的ChatGPT?

相信很多人都已经在使用类ChatGPT的工具进行工作或者娱乐了,这里说的类ChatGPT的是指和ChatGPT相同或者相似功能的产品,包括国外的开源平替模型、百度的文心一言等,但是你真的会使用这些工具和应用吗?你使用的方法是正确的吗&…

软件性能测试过程详解与案例剖析

软件性能测试是软件开发过程中至关重要的一环,它能够帮助我们确保软件在不同负载和使用情况下的表现。在软件性能测试中,我们通常会关注软件的响应时间、吞吐量、并发用户数等指标,以评估软件性能。 软件性能测试过程主要分为以下几个步骤&am…

New:dbForge Edge 2023 4in1 Enterprise Edition Crack

dbForge Edge 2023 4in1 Enterprise Edition 赋予自己开发和管理 SQL Server、MySQL、Oracle 和 PostgreSQL 数据库的广泛能力 dbForge Edge:您的终极多数据库解决方案 让我们来看看。您需要处理多个数据库管理系统。同时,您希望能够灵活有效地处理范围广…

深入剖析PyTorch和TensorFlow:理解二者的区别与联系

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

【JavaEE】MyBatis + 单元测试

目录 MyBaits项目的创建使用 引入相关依赖 配置文件设置 数据库连接 配置XML路径 映射器文件模板 业务代码实例 创建实体类 添加Mapper接口创建映射器 验证是否成功 MyBatis原理 什么是MyBatis 为什么学习MyBatis MyBatis工作原理 单元测试 前置工作 生成测试…

钓鱼对抗之 Coremail安全拦截

作者简介: 胡晓磊,男,山东省城市商业银行合作联盟有限公司邮箱管理员,Coremail管理员社区特邀大咖 钓鱼邮件,是一种常见的网络诈骗手段。一般目的是用来欺骗收件人,将账号、口令或密码等信息回复给指定的接…

ChatGPT:4. 使用OpenAI API创建自己的AI网站:3. flask web框架将OpenAI 创作的图片显示在网页界面上

ChatGPT:4. 使用OpenAI API创建自己的AI网站:3. flask web框架将OpenAI 创作的图片显示在网页界面上 如果你还是一个OpenAI的小白,有OpenAI的账号,但想调用OpenAI的API搞一些有意思的事,那么这一系列的教程将仔细的为…

和数组处理有关的一些OJ题;ArrayList 实现简单的洗牌算法(JAVA)(ArrayList)

接上次博客:数据结构初阶(2)(ArrayList简介、ArrayList()的构造方法、ArrayList的扩容、方法和三种遍历方法、ArrayList实现杨辉三角、ArrayList 的优缺点)_di-Dora的博客-CSDN博客 1、给你一个数组 nums 和一个值 va…

基于springboot篮球论坛系统

开发技术介绍 B/S架构 随着软件系统的不断改进和升级,B/S结构产品更为方便的特征体现地十分明显。对于一个中等偏大的公司来说,如果系统管理员每天要在很多台电脑之间来回查看,不断奔走,那么效率和工作量就会变得很低&#xff0…

RocketMQ 消息发送、消息类别

一、消息发送 1.1 单生产者单消费者消息发送&#xff08;OneToOne&#xff09; 1、新建maven项目recketmqtest 2、导入RocketMQ客户端坐标 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><…