专栏地址:『youcans 的 OpenCV 例程 300篇 - 总目录』
【第 7 章:图像复原与重建】
110. 投影和雷登变换
111. 雷登变换反投影重建图像
112. 滤波反投影重建图像
【youcans 的 OpenCV 例程 300 篇】110. 投影和雷登变换
7. 投影重建图像
7.1 计算机断层成像(Computed tomography)
图像重建(Image Reconstruction)的基本思想,就是通过探测物体的投影数据,重建物体的实际内部构造。
断层成像就是要获得物体内部的截面图像。利用 X射线、超声波等射线穿透被遮挡物体的透视投影图,可以计算恢复物体的断层图,进而可以利用断层图或直接从二维透视投影图重建物体的形状和内部结构。其原理是射线在穿过不同组织时的吸收率不同,在成像面上得到不同的投射强度,由此反演求得内部分布的图像。
X 射线、CT 技术就是应用断层重建的医学诊断方法。计算机断层扫描(CT)已经发展成为一种非常成功和必不可少的医学诊断工具,被认为是 X 射线发现以来医学影像领域最伟大的发明。
X 射线计算机断层成像的基本原理是:使用 X 射线从多个不同方向和角度对物体进行扫描,通过反投影算法获取物体内部结构的切片,堆叠这些切片就可以得到人体的三维表示。
投影重建还应用于地矿探测,接收不同地层和矿体反射的超声波, 按照超声波在媒质的透射率和反射规律,对透射投影图进行分析计算,就可以恢复重建地下的矿体形状。
7.2 投影和雷登变换(Radon transform)
雷登变换是三维重建的数学基础。
一条直线
y
=
a
x
+
b
y=ax+b
y=ax+b 的法线束为:
x
c
o
s
θ
+
y
s
i
n
θ
=
ρ
x cos \theta + y sin \theta = \rho
xcosθ+ysinθ=ρ
沿该直线对函数
f
(
x
,
y
)
f(x,y)
f(x,y) 进行积分,这个积分结果就是雷登变换后的函数
R
f
\mathcal{R}f
Rf 在这条直线上的值:
g
(
ρ
,
θ
)
=
∫
−
∞
+
∞
∫
−
∞
+
∞
f
(
x
,
y
)
δ
(
x
c
o
s
θ
+
y
s
i
n
θ
−
ρ
)
d
x
d
y
g(\rho, \theta) = \int ^{+\infty}_{-\infty} \int ^{+\infty}_{-\infty} f(x,y) \ \delta(x cos \theta + y sin \theta - \rho) dxdy
g(ρ,θ)=∫−∞+∞∫−∞+∞f(x,y) δ(xcosθ+ysinθ−ρ)dxdy
雷登变换的离散形式:
g
(
ρ
,
θ
)
=
∑
x
=
0
M
−
1
∑
y
=
0
N
−
1
f
(
x
,
y
)
δ
(
x
c
o
s
θ
+
y
s
i
n
θ
−
ρ
)
g(\rho, \theta) = \sum ^{M-1}_{x=0} \sum^{N-1}_{y=0} f(x,y) \ \delta(x cos \theta + y sin \theta - \rho)
g(ρ,θ)=x=0∑M−1y=0∑N−1f(x,y) δ(xcosθ+ysinθ−ρ)
雷登变换将二维空间 x y xy xy 映射到了另一个二维空间 α s \alpha s αs,称为直线空间。
雷登变换常被用于医学影像处理,利用反雷登变换可以进行三维图像重建。
例程 9.23:雷登变换正弦图
# # 9.23: 雷登变换正弦图
from scipy import ndimage
def discreteRadonTransform(image, steps):
channels = image.shape[0]
res = np.zeros((channels, channels), dtype=np.float32)
for s in range(steps):
rotation = ndimage.rotate(image, -s * 180/steps, reshape=False).astype(np.float32)
res[:, s] = sum(rotation)
return res
# # 读取原始图像
plt.figure(figsize=(9, 7))
fileImg = ["Fig0534a.tif", "Fig0534b.tif", "Fig0534c.tif"] # 原始图像 文件名
for i in range(len(fileImg)):
img = cv2.imread("../images/"+fileImg[i], flags=0) # flags=0 读取为灰度图像
imgRadon = discreteRadonTransform(img, img.shape[0]) # Radon 变换
print(img.shape, imgRadon.shape)
plt.subplot(2, len(fileImg), i + 1), plt.axis('off') # 绘制原始图像
plt.title("origin image"), plt.imshow(img, 'gray')
plt.subplot(2, len(fileImg), i + len(fileImg) + 1), plt.axis('off') # 绘制 sinogram 图
plt.title("Radon transform"), plt.imshow(imgRadon, 'gray')
plt.tight_layout()
plt.show()
(本节完)
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/123088031)
Copyright 2022 youcans, XUPT
Crated:2022-2-25