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');

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

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


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

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计算小屋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值