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

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.mzph.cn/web/49561.shtml

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

相关文章

SRTOD

文章目录 AbstractMethodoverviewinnovationsolve Experiment link Abstract 本文主要探讨了在目标检测领域中,如何解决微小物体检测的问题。传统的通用检测器在处理微小物体时性能下降严重,主要是因为难以提取有效的特征。为了解决这个问题&#xff0c…

SLAM面试题

常见的slam面试问题如下,在文章末尾有《自动驾驶100问》的视频内容,可以去看看: 1.重定位和回环检测的区别是什么? 2.单应矩阵H和基础矩阵F的区别是什么? 3.视觉SLAM方法的分类和对应的特点分析。 4.关键帧的作用是…

STL-string(使用和部分模拟实现)

1.string basic_string<char> 是 C 标准库中定义的一个模板类型,用于表示一个字符串。这个模板类接收一个字符类型作为模板参数。typedef basic_string<char> string&#xff1a;string类是basic_string类模板的实例化&#xff0c;它使用 char作为其字符类型。 2.…

狗都能看懂的Actor-Critic强化学习算法讲解

Review Policy Gradient 上面的公式是Policy Gradient的更新函数&#xff0c;这个式子是指在 s t s_t st​时刻采取了 a t a_t at​&#xff0c;计算出对应发生的概率 p θ p_\theta pθ​&#xff0c;然后计算在采取了这个 a t a_t at​之后&#xff0c;所得到的reward有多大。…

分布式智能:Mojo模型在分布式系统中的动态使用策略

分布式智能&#xff1a;Mojo模型在分布式系统中的动态使用策略 在当今的大数据时代&#xff0c;机器学习模型经常需要在分布式系统中运行&#xff0c;以处理大规模数据集并提高计算效率。Mojo模型&#xff0c;作为一个泛指&#xff0c;可以代表任何机器学习或深度学习模型。实…

Java 注解概述和自定义注解案例

文章目录 一、注解概述1.1 什么是注解1.2 注解的用途1.3 注解的常见种类1.4 注解类型和常用注解 二、自定义注解2.1 自定义注解的格式2.2 自定义注解中的属性2.3 自定义注解的案例 参考资料 一、注解概述 1.1 什么是注解 注解是元数据的一种形式&#xff0c;它提供的数据不是…

Android 里SQLite和ROOM框架简单介绍

简单的Android SQLite使用 最简单的SQLite 在 Android 开发中&#xff0c;SQLite是一个轻量级的关系型数据库管理系统&#xff0c;经常用于存储和管理应用程序的数据。如果你刚刚学习Android数据库的使用&#xff0c;你一定要学习SQLite的使用。以下是一个简单的示例&#xf…

优化算法|自适应大邻域搜索算法及MATLAB代码实现

回来填坑了&#xff0c;本篇推文将详细讲解ALNS算法求解VRP问题及MATLAB代码实现。 算法介绍 节约算法构造初始解 function routessaving_init(DistMatrix, Demand, Cap) C_EPS1e-1;Nsize(DistMatrix,1); routescell(numel(2:N),1); for i1:numel(routes) % 每个节点单独一条…

Javascript面试基础6【每日更新10】

Gulp gulp是前端开发过程中一种基于流的代码构建工具&#xff0c;是自动化项目的构建利器;它不仅能对网站资源进行优化&#xff0c;而且在开发过程中很多重复的任务能够使用正确的工具自动完成 Gulp的核心概念:流 流&#xff0c;简单来说就是建立在面向对象基础上的一种抽象的…

【Django】前端技术HTML常用标签(开发环境vscode)

文章目录 安装两个常用插件HTML常用标签定义文档类型DOCTYPE网页的结构html/head//title/body/div标题h1/h2/h3/h4/h5分割线hr段落 p列表ul/li&#xff0c;ol/li超链接a文本span图片img按钮button表格table&#xff08;table、tr、th、td&#xff09;表单form 安装两个常用插件…

基于riscv64架构的Dayu800开发板的napi_demo开发介绍

itopen组织1、提供OpenHarmony优雅实用的小工具2、手把手适配riscv qemu linux的三方库移植3、未来计划riscv qemu ohos的三方库移植 小程序开发4、一切拥抱开源&#xff0c;拥抱国产化 一、环境准备工作 1.1 Ubuntu20.04环境配置 如果已经配置OpenHarmony的编译环境则…

目标检测 YOLOv5-7.0 详细调试自制数据集实战

目标检测 YOLOv5-7.0 详细调试&自制数据集实战 一、项目介绍及环境配置&#xff08;一&#xff09;项目解读&#xff08;二&#xff09;版本选择&#xff08;三&#xff09;环境配置 二、如何利用YOLOv5进行预测&#xff08;detect.py&#xff09;&#xff08;一&#xff0…

Windows 实用小工具:窗口钉子/文件管理 2024/7/27

一: wintop 窗口置顶工具 二:WinDirStat 这是一个免费的、开源的磁盘使用分析工具&#xff0c;适用于Windows系统。它会扫描你的硬盘&#xff0c;列出所有文件和文件夹的大小&#xff0c;并以图形化的方式展示&#xff0c;便于理解。 可以用来检测硬盘文件夹占用从而,酌情处…

【C#】获取DICOM图像像素的像素值

8位像素深度的像素值 public byte GetGreyValue(int x, int y) {x Math.Min(x, m_nWidth - 1);y Math.Min(y, m_nHeight - 1);unsafe{byte* greyValue (byte*)m_pDicomData.ToPointer() y * m_nWidth x;return *greyValue;} } 16位像素深度的像素值 public ushort GetG…

JAVA.抽象、接口、内部类

1.抽象 共性&#xff0c;父类定义抽象方法&#xff0c;子类必须重写&#xff0c;或者子类也是抽象类 示例代码 animal package animalabstract;//定义抽象类animal public abstract class animal {String name;int age;//定义抽象方法eat&#xff0c;子类必须重写public abs…

Java给定一些元素随机从中选择一个

文章目录 代码实现java.util.Random类实现随机取数(推荐)java.util.Collections实现(推荐)Java 8 Stream流实现(不推荐) 完整代码参考&#xff08;含测试数据&#xff09; 在Java中&#xff0c;要从给定的数据集合中随机选择一个元素&#xff0c;我们很容易想到可以使用 java.…

Redis快速入门(一)

一、初识Redis 1、认识NoSQL NoSql可以翻译做Not Only Sql(不仅仅是SQL),或者是No Sql(非Sql的)数据库。是相对于传统关系型数据库而言,有很大差异的一种特殊的数据库,因此也称之为非关系型数据库。   a)结构化与非结构化   传统关系型数据库是结构化数据,每一张…

【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件

目录 ​编辑 前言 系统调用 open 参数flags 参数mode write 追加方式 read close 文件描述符 打开多个文件并观察其文件描述符 C语言文件操作 理解一切皆文件 理解open操作 前言 各类语言的文件操作其实是对系统调用的封装 我们经常说&#xff0c;创建一个文件&a…

力扣第三十七题——解数独

内容介绍 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff09; 数独…