Radon(拉当) 变换:超详细讲解(附MATLAB,Python 代码)

news2024/9/19 23:56:25

Radon 变换

Radon 变换是数学上用于函数或图像的一种积分变换,广泛应用于图像处理领域,尤其是在计算机断层成像 (CT) 中。本文档将详细介绍 Radon 变换的数学含义及其在图像处理中的应用。

数学定义

Radon 变换的数学定义是将二维函数 f ( x , y ) f(x,y) f(x,y) 转换为其在各个角度 θ \theta θ 上的投影。设 f ( x , y ) f(x,y) f(x,y) 是定义在 R 2 \mathbb{R}^2 R2 上的函数,Radon 变换可以表示为:

R { f } ( p , θ ) = ∫ − ∞ ∞ ∫ − ∞ ∞ f ( x , y ) δ ( x cos ⁡ θ + y sin ⁡ θ − p )   d x   d y R\{f\}(p,\theta) = \int_{-\infty}^{\infty} \int_{-\infty}^{\infty} f(x,y) \delta(x\cos\theta + y\sin\theta - p) \,dx\,dy R{f}(p,θ)=f(x,y)δ(xcosθ+ysinθp)dxdy

其中, δ \delta δ 是 Dirac delta 函数, p p p 是在角度 θ \theta θ 上的投影距离。

更直观地,可以将 Radon 变换理解为:在给定的角度 θ \theta θ 上,通过将图像 f ( x , y ) f(x,y) f(x,y) 沿垂直于 θ \theta θ 的方向进行积分,得到在该角度上的投影 R { f } ( p , θ ) R\{f\}(p,\theta) R{f}(p,θ).

性质

Radon 变换具有以下几个重要性质:

  1. 线性性质:若 f f f g g g 是两个函数, a a a b b b 是常数,则有
    R { a f + b g } = a R { f } + b R { g } R\{af + bg\} = aR\{f\} + bR\{g\} R{af+bg}=aR{f}+bR{g}

  2. 平移性质:若 f ( x , y ) f(x,y) f(x,y) 平移了 ( x 0 , y 0 ) (x_0, y_0) (x0,y0),则其 Radon 变换的结果也是相应平移的。

  3. 旋转性质:若 f ( x , y ) f(x,y) f(x,y) 旋转了角度 ϕ \phi ϕ,则其 Radon 变换的结果也相应旋转 ϕ \phi ϕ.

在图像处理中的应用

Radon 变换在图像处理中的应用非常广泛,以下是几个主要应用领域:

1. 计算机断层成像 (CT)

在 CT 成像中,Radon 变换用于从多个角度获取对象内部结构的投影数据。这些投影数据经过反投影算法处理后,可以重建出对象的内部图像。具体步骤如下:

  1. 获取投影数据:通过旋转 X 射线源和检测器,获取不同角度的投影数据。
  2. Radon 变换:将二维图像 f ( x , y ) f(x,y) f(x,y) 转换为多个角度的投影 R { f } ( p , θ ) R\{f\}(p,\theta) R{f}(p,θ).
  3. 反投影:使用逆 Radon 变换将投影数据 R { f } ( p , θ ) R\{f\}(p,\theta) R{f}(p,θ) 重建回二维图像 f ( x , y ) f(x,y) f(x,y).

2. 图像复原

在图像复原中,Radon 变换可以用于去噪和增强图像。例如,可以通过分析不同角度的投影数据,识别和去除图像中的噪声,从而提高图像质量。

3. 模式识别

Radon 变换还可以用于模式识别和特征提取。在这类应用中,可以通过分析图像在不同角度的投影数据,提取出特定模式或特征,从而实现图像分类或目标识别。

逆 Radon 变换

逆 Radon 变换用于将投影数据恢复成原始图像。通常使用滤波反投影算法 (Filtered Back Projection, FBP) 来实现。其基本步骤如下:

  1. 对投影数据应用滤波操作,通常使用 Ram-Lak 滤波器。
  2. 将滤波后的投影数据进行反投影,得到重建图像。

逆 Radon 变换的数学表示为:

f ( x , y ) = ∫ 0 π R { f } ( p , θ )   d θ , f(x,y) = \int_{0}^{\pi} R\{f\}(p,\theta) \, d\theta, f(x,y)=0πR{f}(p,θ)dθ,

其中, R { f } ( p , θ ) R\{f\}(p,\theta) R{f}(p,θ) 是滤波后的投影数据。

示例代码

以下是一个使用 Python 和 Scipy 实现 Radon 变换和逆 Radon 变换的示例代码:

import numpy as np
import matplotlib.pyplot as plt
from skimage.transform import radon, iradon

# 生成一个二维图像
image = np.zeros((100, 100))
image[30:70, 30:70] = 1

# 执行 Radon 变换
theta = np.linspace(0., 180., max(image.shape), endpoint=False)
sinogram = radon(image, theta=theta, circle=True)

# 执行逆 Radon 变换
reconstruction = iradon(sinogram, theta=theta, circle=True)

# 显示原始图像、Radon 变换结果和重建图像
fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(15, 5))
ax1.set_title("Original")
ax1.imshow(image, cmap=plt.cm.Greys_r)
ax2.set_title("Radon Transform\n(Sinogram)")
ax2.set_xlabel("Projection angle (deg)")
ax2.set_ylabel("Projection position (pixels)")
ax2.imshow(sinogram, cmap=plt.cm.Greys_r, aspect='auto')
ax3.set_title("Reconstruction\nfrom Radon transform")
ax3.imshow(reconstruction, cmap=plt.cm.Greys_r)
plt.show()

结果显示:
在这里插入图片描述
以上代码展示了用 Scipy 库进行 Radon 变换和逆 Radon 变换,并正确显示原始图像、Radon 变换的结果(正弦图)以及重建图像。

Matlab 例子

为了读者方便,这里再给出一个 Matlab Radon 变换的例子。
以下是一个使用 MATLAB 实现 Radon 变换和逆 Radon 变换的示例代码:

% 生成一个二维图像
image = zeros(100, 100);
image(30:70, 30:70) = 1;

% 执行 Radon 变换
theta = 0:179;
[R, xp] = radon(image, theta);

% 执行逆 Radon 变换
I = iradon(R, theta);

% 显示原始图像、Radon 变换结果和重建图像
figure;
subplot(1,3,1);
imshow(image, []);
title('Original');

subplot(1,3,2);
imagesc(theta, xp, R);
xlabel('Projection angle (degrees)');
ylabel('X''');
title('Radon Transform (Sinogram)');

subplot(1,3,3);
imshow(I, []);
title('Reconstruction from Radon transform');

运行结果:
在这里插入图片描述
效果不错!

如果读者有需求,我们将通过一系列博客展示图像处理相关的知识,所有文章均有相应代码实现。请持续关注!


作者 :计算小屋
个人主页 : 计算小屋的主页

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

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

相关文章

Spark实时(二):StructuredStreaming编程模型

文章目录 StructuredStreaming编程模型 一、基础语义 二、事件时间和延迟数据 三、​​​​​​​容错语义 StructuredStreaming编程模型 一、基础语义 Structured Streaming处理实时数据思想是将实时数据看成一张没有边界的表,数据源源不断的追加到这张表中,这可以让我…

零基础STM32单片机编程入门(二十二) ESP8266 WIFI模块实战含源码

文章目录 一.概要二.ESP8266 WIFI模块主要性能参数三.ESP8266 WIFI模块芯片内部框图四.ESP8266 WIFI模块原理图五.ESP8266 WIFI模块与单片机通讯方法1.硬件连接2.ESP8266模块AT指令介绍 六.STM32单片机与ESP8266WIFI模块通讯实验1.硬件准备2.软件工程3.软件主要代码4.实验效果 …

Super 4PCS配准算法

Nicolas Mellado,CNRS(Centre national de la recherche scientifique,法国国家科学研究中心)的研究员,在IRIT(Institut de Recherche en Informatique de Toulouse,图卢兹计算机科学研究所&…

LeetCode Hot100 搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。…

自动化测试 pytest 中 scope 限制 fixture使用范围!

导读 fixture 是 pytest 中一个非常重要的模块,可以让代码更加简洁。 fixture 的 autouse 为 True 可以自动化加载 fixture。 如果不想每条用例执行前都运行初始化方法(可能多个fixture)怎么办?可不可以只运行一次初始化方法? 答&#xf…

学习笔记:《用Python进行数据分析》之通用函数

通用函数(即ufunc)是一种对ndarray中的数据执行元素级运算的函数。你可以将其看做简单函数(接受一个或多个标量值,并产生一个或多个标量值)的矢量化包装器。 许多ufunc都是简单的元素级变体,如sqrt和exp&a…

HTML前端面试题之<iframe>标签

面试题:iframe 标签的作用是什么?有哪些优缺点 ? 讲真,刷这道面试题之前我根本没有接触过iframe,网课没讲过,项目实战没用过,但却在面试题里出现了!好吧,我只能说:前端路漫漫&…

通过 C# 写入数据到Excel表格

Excel 是一款广泛应用于数据处理、分析和报告制作的电子表格软件。在商业、学术和日常生活中,Excel 的使用极为普遍。本文将详细介绍如何使用免费.NET库将数据写入到 Excel 中,包括文本、数值、数组、和DataTable数据的输入。 文章目录 C# 在Excel单元格…

uniapp map组件自定义markers标记点

需求是根据后端返回数据在地图上显示标记点&#xff0c;并且根据数据状态控制标记点颜色&#xff0c;标记点背景通过两张图片实现控制 <mapstyle"width: 100vw; height: 100vh;":markers"markers":longitude"locaInfo.longitude":latitude&…

Python 实现股票指标计算——DMA

DMA (Deviation Moving Average) - 平均差 1 公式 DMA 收盘价N1日简单平均 - 收盘价N2日简单平均 AMA M日DMA简单平均 2 数据准备 我们以科创50指数 000688 为例&#xff0c;指数开始日期为2019-12-31&#xff0c;数据格式如下&#xff1a; 3 计算过程 def calculate_d…

构造+有序集合,CF 1023D - Array Restoration

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1023D - Array Restoration 二、解题报告 1、思路分析 先考虑合法性检查&#xff1a; 对于数字x&#xff0c;其最左位置和最右位置 之间如果存在数字比x小&#xff0c;则非法 由于q次操作&#xff0c;第q…

Dav_笔记11:SQL Tuning Overview-sql调优 之 5

构建SQL测试用例 对于许多与SQL相关的问题&#xff0c;获得可重现的测试用例可以更轻松地解决问题。从11g第2版&#xff08;11.2&#xff09;开始&#xff0c;Oracle数据库包含SQL测试用例构建器&#xff0c;它可以自动完成收集和复制尽可能多的有关问题及其发生环境的信息的难…

Asp .Net Core 系列:详解授权以及实现角色、策略、自定义三种授权和自定义响应

什么是授权&#xff08;Authorization&#xff09;&#xff1f; 在 ASP.NET Core 中&#xff0c;授权&#xff08;Authorization&#xff09;是控制对应用资源的访问的过程。它决定了哪些用户或用户组可以访问特定的资源或执行特定的操作。授权通常与身份验证&#xff08;Auth…

vue3 vxe-table 点击行,不显示选中状态,加上设置isCurrent: true就可以设置选中行的状态。

1、上个图&#xff0c;要实现这样的&#xff1a; Vxe Table v4.6 官方文档 2、使用 row-config.isCurrent 显示高亮行&#xff0c;当前行是唯一的&#xff1b;用户操作点击选项时会触发事件 current-change <template><div><p><vxe-button click"sel…

大模型算法面试题(十二)

本系列收纳各种大模型面试题及答案。 1、领域模型Continue PreTrain数据如何选取 在领域模型的Continue PreTrain&#xff08;持续预训练&#xff09;过程中&#xff0c;数据选取是一个至关重要的步骤&#xff0c;它直接影响模型在特定领域上的性能和泛化能力。以下是一些关于…

【资料分享】2024钉钉杯大数据挑战赛A题思路解析+代码演示

2024第三届钉钉杯大学生大数据挑战赛今天已经开赛&#xff0c;【A题】思路解析代码&#xff0c;资料预览&#xff1a;

京东发行稳定币的背后

加密市场很热&#xff0c;京东也要来分一杯羹&#xff1f; 7月24日&#xff0c;据财联社报道&#xff0c;京东科技旗下的京东币链科技 ( 香港 ) 将在香港发行与港元 1:1锚定的加密货币稳定币&#xff0c;在市场上掀起广泛热议。 由于众所周知的监管原因&#xff0c;国内大厂在早…

Window下CLion实现本机通过socket通信-C++

1.引言-什么是socket socket即套接字&#xff0c;用于描述地址和端口&#xff0c;是一个通信链的句柄。应用程序通过socket向网络发出请求或者回应。 sockets(套接字)编程有三种&#xff0c;流式套接字&#xff08;SOCK_STREAM&#xff09;&#xff0c;数据报套接字&#xff…

Ubuntu18.04.6 LTS安装opencv3.3.0(详细步骤教程)

本章教程在Ubuntu18.04.6LTS上安装opencv3.3.0版本,亲测已安装成功。 一、下载opencv安装包 1、下载 wget https://github.com/opencv/opencv/archive/3.3.0.zip2、解压 unzip opencv-3.3.0.zip如果没有unzip命令,需要先安装一下 apt install unzip

2024第八届自然语言处理与信息检索国际会议 (NLPIR 2024)即将召开!

2024第八届自然语言处理与信息检索国际会议 (NLPIR 2024)将于2024年12月13-15日在日本冈山的冈山大学举行。NLPIR 2024将为自然语言处理与信息检索领域的专家学者提供一个交流与合作的平台&#xff0c;推动该领域的学术进步和技术创新。同时&#xff0c;本次会议也将为相关企业…