Python实现离散Radon变换

因为我最近的工作需要用到Radon变换,所以简单地学习了一下相关内容。网上有很多关于Randon变换的介绍,大家可以自行查找,我就不再赘述了,但是很多人都是直接使用的MATLAB中的radon() 函数来完成这个变换的,而我所在的组没有购买MATLAB,因此直接使用MATLAB存在版权风险,所以我只能考虑使用Python进行实现,现在把源码和一些结果贴上来跟大家分享和讨论:

from scipy import ndimage
import numpy as np
import matplotlib.pyplot as plt
import imageio
from cv2 import cv2


def DiscreteRadonTransform(image, steps):
    channels = len(image[0])
    res = np.zeros((channels, channels), dtype='float64')
    for s in range(steps):
        rotation = ndimage.rotate(image, -s*180/steps, reshape=False).astype('float64')
        #print(sum(rotation).shape)
        res[:,s] = sum(rotation)
    return res

#读取原始图片
#image = cv2.imread("whiteLineModify.png", cv2.IMREAD_GRAYSCALE)
#image=imageio.imread('shepplogan.jpg').astype(np.float64)
#image = cv2.imread("whitePoint.png", cv2.IMREAD_GRAYSCALE)
image = cv2.imread("shepplogan.jpg", cv2.IMREAD_GRAYSCALE)
radon = DiscreteRadonTransform(image, len(image[0]))
print(radon.shape)

#绘制原始图像和对应的sinogram图
plt.subplot(1, 2, 1)
plt.imshow(image, cmap='gray')
plt.subplot(1, 2, 2)
plt.imshow(radon, cmap='gray')
plt.show()

因为Radon变换常被用于医学影像(CT)和直线检测,所以在检验代码的时候,我使用了两个原始图片:一个是Shepp-Logan模型的图,另一个是仅有一条直线的图。下面是具体的结果:
对Shepp-Logan模型图片进行Radon变换的结果,左侧是原始的图像,右侧是所谓的Sinogram图。直线检测的简单测试,左侧是原始图像,右侧是Radon变换后得到的结果。
上面就是我进行测试得到的结果,左侧原始的图片,右侧对应的是对左侧的图像进行Radon变换后得到的结果。据我肉眼观察,得到的结果跟其他人直接使用MATLAB中的radon() 函数得到的结果是一样的。如果有错误的地方,欢迎大家批评指正。

2020年8月12日补充 最近看到有人私信问我使用imageio发生数组尺寸不匹配的问题,产生这个问题的一个可能的原因和你使用的Shepp-Logan图片的色彩模式有关,如果你的图片是RGB模式或者RGBA模式(默认情况下matplotlib生成的图片是这个色彩模式),请使用image = cv2.imread(“whitePoint.png”, cv2.IMREAD_GRAYSCALE),这一语句会把你输入的图片变成灰度图,这样每个像素就只有一个值——灰度了,然后我们就可以使用沿着列求和的方式模拟投影过程了。我把文中的代码改了,把使用imageio那句给注释掉了。

  • 23
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值