【OpenCV 例程 300 篇】111. 雷登变换反投影重建图像

专栏地址:『youcans 的 OpenCV 例程 300篇 - 总目录』

【第 7 章:图像复原与重建】
110. 投影和雷登变换
111. 雷登变换反投影重建图像
112. 滤波反投影重建图像


【youcans 的 OpenCV 例程 300 篇】111. 雷登变换反投影重建图像


7. 投影重建图像

图像重建的基本思想,就是通过探测物体的投影数据,重建物体的实际内部构造。

7.2 雷登变换反投影重建图像(Radon transform back projection)

空间点 X 通过摄像机 P 被作用到图像平面的图像点 m = PX , 获得采集到的图像数据,这种投影关系称为摄像机的正向投影 (forward projection) ,简称投影。

反向投影是针对图像平面的基本几何元素而言的,图像平面点 m 的反投影是指在摄像机 P 的作用下具有像点 m 的所有空间点的集合。

反投影一个点形成部分图像的过程,是将直线 L ( ρ j , θ k ) L(\rho_j,\theta_k) L(ρj,θk) 复制到图像上,直线上每点的灰度值是 g ( ρ j , θ k ) g(\rho_j,\theta_k) g(ρj,θk)。遍历投影信号中的每个点,得到:
f θ ( x , y ) = g ( ρ , θ ) = g ( x c o s θ + y s i n θ ) f_{\theta}(x,y) = g(\rho,\theta) = g(x cos \theta + ysin \theta) fθ(x,y)=g(ρ,θ)=g(xcosθ+ysinθ)
对所有反投影图像积分,得到最终的图像:
f ( x , y ) = ∫ 0 π f θ ( x , y ) d θ f(x,y) = \int_0^{\pi}f_{\theta}(x,y)d\theta f(x,y)=0πfθ(x,y)dθ
其离散形式为:

f ( x , y ) = ∑ θ = 0 π f θ ( x , y ) f(x,y) = \sum_{\theta=0}^{\pi}f_{\theta}(x,y) f(x,y)=θ=0πfθ(x,y)

反投影的图像有时称为层图,可以理解为投影图像的一个近似。


例程 9.24:雷登变换反投影重建图像

    # 9.24: 雷登变换反投影重建图像
    from scipy import ndimage
    def discreteRadonTransform(image, steps):  # 离散雷登变换
        channels = image.shape[0]
        resRadon = np.zeros((channels, channels), dtype=np.float32)
        for s in range(steps):
            rotation = ndimage.rotate(image, -s * 180/steps, reshape=False).astype(np.float32)
            resRadon[:, s] = sum(rotation)
        return resRadon

    def inverseRadonTransform(image, steps):  # 雷登变换反投影
        channels = image.shape[0]
        res = np.zeros((steps, channels, channels))
        for s in range(steps):
            expandDims = np.expand_dims(image[:, s], axis=0)
            repeat = expandDims.repeat(channels, axis=0)
            res[s] = ndimage.rotate(repeat, s * 180/steps, reshape=False).astype(np.float32)
        invRadon = np.sum(res, axis=0)
        return invRadon


    # 读取原始图像
    img1 = cv2.imread("../images/Fig0534a.tif", 0)  # flags=0 读取为灰度图像
    img2 = cv2.imread("../images/Fig0534c.tif", 0)

    # 雷登变换
    imgRadon1 = discreteRadonTransform(img1, img1.shape[0])  # Radon 变换
    imgRadon2 = discreteRadonTransform(img2, img2.shape[0])

    # 雷登变换反投影
    imgInvRadon1 = inverseRadonTransform(imgRadon1, imgRadon1.shape[0])
    imgInvRadon2 = inverseRadonTransform(imgRadon2, imgRadon2.shape[0])

    plt.figure(figsize=(9, 7))
    plt.subplot(231), plt.axis('off'), plt.title("origin image"), plt.imshow(img1, 'gray')  # 绘制原始图像
    plt.subplot(232), plt.axis('off'), plt.title("Radon transform"), plt.imshow(imgRadon1, 'gray')  # 绘制 sinogram 图
    plt.subplot(233), plt.axis('off'), plt.title("Inv-Radon transform"), plt.imshow(imgInvRadon1, 'gray')
    plt.subplot(234), plt.axis('off'), plt.title("origin image"), plt.imshow(img2, 'gray')
    plt.subplot(235), plt.axis('off'), plt.title("Radon transform"), plt.imshow(imgRadon2, 'gray')
    plt.subplot(236), plt.axis('off'), plt.title("Inv-Radon transform"), plt.imshow(imgInvRadon2, 'gray')
    plt.tight_layout()
    plt.show()

在这里插入图片描述


(本节完)


版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/123088322)
Copyright 2022 youcans, XUPT
Crated:2022-2-28


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

youcans_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值