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://xiahunao.cn/news/3269409.html

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

相关文章

vue 开发环境配置

1. nvm 安装 在 github上下载 最新的 nvm 包 https://github.com/coreybutler/nvm-windows/releases或者在 csdn 上下载(从github上迁移,方便下载)https://download.csdn.net/download/u011171506/89585197 下载后不用修改任何配置&#x…

提取视频中的文字如何提取?分享4种简单提取方法

在短视频时代,视频已成为信息传播的重要载体。然而,面对海量的视频资源,如何高效提取其中的文字信息,成为许多人关注的焦点,因为快速提取出视频中的文字可以帮助我们整理、编辑文本信息,下面给大家分享4种简…

构建现代化农业产业服务平台的系统架构

随着全球农业产业的发展和技术的进步,农业生产管理面临着越来越复杂的挑战和机遇。建立一个现代化的农业产业服务平台系统架构,不仅能够提高农业生产效率和管理水平,还能促进农民收入增长和可持续发展。本文将探讨如何设计和实施这样一个系统…

1.1 线性表顺序结构的定义及实现

1. 顺序表定义 把线性表的结点按逻辑顺序依次存放在一组地址连续的存储单元里。用这种方法存储的线性表简称顺序表。 2.顺序表特点 1)线性表的逻辑顺序与物理顺序一致; 2)数据元素之间的关系是以元素在计算机内“物理位置相邻”来体现。设有…

将手机作为服务器运行docker服务

前言 目前手机的配置并不低,即使是2019年生产的一加七Pro,配置也有12256,CPU是骁龙855,作为服务器运行着配置绰绰有余了,二手的价格现在是400左右也能接受。相对于是自带ups电源的便携低耗docker服务器,还…

分布式事务和2阶段提交

在当今世界,数据正在以惊人的速度增长。单台计算机的存储容量是有限的,因此需要将数据分布在多台机器或数据库上,这种技术被称为分布式技术。 互联网大厂中很多系统都在采用微服务架构。在这种架构中,每个微服务都管理自己的数据…

NXP i.MX 6系列处理器加入“产品长期供货计划”

近期,NXP(恩智浦半导体)的i.MX 6系列处理器已加入其“产品长期供货计划”,不同型号处理器的生命周期得到了10~15年的延长,确保了长期稳定的供货与维护。 (NXP产品长期供货计划的目的,是给客户的…

pycharm关闭项目时,页面卡住了,怎么办?

问题 在关闭pycharm时,有时会遇到卡在退出进度条的界面,很讨厌,那我们要怎么办才能退出呢? 说明:本篇文章不是从根源上解决这个问题,无法避免这种情况。 解决方法 方法一: 在卡住时&#xf…

Redis 7.x 系列【27】集群原理之通信机制

有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2 节点和节点2.1 集群拓扑2.2 集群总线协议2.3 流言协议2.4 心跳机制2.5 节点握…

【推研小灶】复旦与南大之间:一次独特的计算机保研之旅

写在前面 上午10点填完志愿等待复试通知,利用这段时间记录一下我简短的夏令营和预推免。今年变为线下之后,部分学校的入营情况、考核方式有明显变化。加上CS方向保研名额总体变多,形势有点小乱,甚至填报系统都在9.29中秋节当天&a…

Python如何获取终端尺寸?

os.get_terminal_size(),无差别获取当前终端长宽,让你为所欲为。 (笔记模板由python脚本于2024年07月27日 08:30:53创建,本篇笔记适合喜欢钻研的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Fre…

【Python系列】Parquet 数据处理与合并:高效数据操作实践

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

unity2D游戏开发08脚本化对象

创建Scriptable Object 在scripts文件夹下创建一个名为Sriptable Objects的文件夹,然后在文件夹里面创建一个名为Item的脚本 using System.Collections; using System.Collections.Generic; using UnityEngine;//[CreateAssetMenu] 是一个属性(Attribute),用于告诉Unity编…

非UI设计师勿入,英文B端界面的确有可取之处.

作为中文的UI设计师,可以从英文B端界面中汲取设计灵感的几种方法: 观察布局和结构: 注意英文B端界面的布局和结构,包括导航栏、侧边栏、内容区域等。观察它们的排列方式、比例和空白间隙的运用,可以借鉴到自己的设计中…

GeoHash原理介绍以及在redis中的应用

GeoHash将二维信息编码成了一个一维信息。降维后有三个好处: 编码后数据长度变短,利于节省存储。利于使用前缀检索当分割的足够细致,能够快速的对双方距离进行快速查询 GeoHash是一种地址编码方法。他能够把二维的空间经纬度数据编码成一个字符串。 1…

十一、【Python】基础教程-【Python全掌握】六大基础数据类型:布尔类型的终极指南

目录 一、基础类型“布尔型”处理方法 1. 直接赋值和使用 2. 布尔值的逻辑运算 3. 条件语句中的布尔值 4. 布尔值转换 5. 短路逻辑 6. 在循环和迭代中的使用 一、基础类型“布尔型”处理方法 在Python中,布尔类型是一种基本的数据类型,用于表示逻…

3DMAX一键藤球建模插件RattanBall使用方法

3DMAX一键藤球建模插件RattanBall使用教程 3DMAX藤球建模插件RattanBall,一键创建藤球模型,可以设置藤球大小、嵌套层数等,简单实用,一键生成! 【适用版本】 3dMax2018.2及更高版本 【安装方法】 3DMAX一键藤球建模插…

Animate软件基础:创建及插入关键帧

这里讲一下Animate软件中创建或插入关键帧的基本方法。 FlashASer:Animate教程及作品源文件https://zhuanlan.zhihu.com/p/677437436 FlashASer:实用的各种Adobe Animate软件教程https://zhuanlan.zhihu.com/p/675680471 FlashASer:Animat…

UE5.4内容示例(1)- 学习笔记

https://www.unrealengine.com/marketplace/zh-CN/product/content-examples 《内容示例》是学习UE5的基础示例,可以用此示例熟悉一遍UE5的功能 模型与材质部分 StaticMeshes FBX_Import_Options Material_Advanced Material_Decals Material_Instances Material_N…