You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中iradon()函数报错:theta与投影数不匹配的解决咨询

解决iradon()函数中theta与投影数量不匹配的问题

报错本质

报错The given 'theta' does not match the number of projections in 'radon_image'的核心逻辑很明确:theta数组的元素个数必须和radon_image的**第二维度(列数)**完全相等——因为radon_image的每一列对应Radon变换时一个角度的投影数据,和目标图像的像素尺寸(比如你提到的256)没有任何关系,你之前的误解是错误的。

针对你的场景的解决方向

你的核心问题是角度子集和对应的Radon投影子集不匹配,以下是具体修复步骤:

1. 明确对应关系:角度子集 ↔ 投影子集

不管你怎么拆分角度矩阵,必须保证:

  • 用于逆变换的theta数组长度 = 对应radon_image的列数
  • 每个theta元素必须和radon_image对应列的投影是同一角度生成的

2. 两种常见场景的修复代码

场景A:预先按角度子集生成投影

如果你需要对每个角度子集单独做逆变换,建议先基于子集角度生成对应的Radon投影,再执行逆变换:

from skimage.transform import radon, iradon
import numpy as np

# 示例数据:21×28的角度矩阵,256×256的原始图像
angle_matrix = np.random.uniform(0, 180, (21, 28))
original_img = np.random.rand(256, 256)

# 遍历每个角度子集
for i in range(21):
    # 提取当前子集的28个角度
    current_thetas = angle_matrix[i, :]
    # 基于当前角度生成对应的Radon投影(列数=28,和theta长度一致)
    current_radon = radon(original_img, theta=current_thetas)
    # 执行逆拉东变换,此时theta和投影数量完全匹配
    recon_img = iradon(current_radon, theta=current_thetas)
    # 后续处理重建图像...
场景B:已有全角度生成的投影,拆分后使用

如果已经预先用完整的21×28角度生成了全量Radon投影,需要按角度子集的范围拆分投影数组:

# 预先生成全角度投影和角度数组
full_thetas = angle_matrix.flatten()  # 588个角度
full_radon = radon(original_img, theta=full_thetas)  # 形状(256, 588)

# 遍历拆分后的角度子集
for i in range(21):
    # 计算当前子集的角度索引范围(每组28个)
    start = i * 28
    end = start + 28
    # 提取对应角度和投影列
    current_thetas = full_thetas[start:end]
    current_radon = full_radon[:, start:end]
    # 执行逆变换
    recon_img = iradon(current_radon, theta=current_thetas)

3. 排查常见错误点

  • 检查radon_image的形状:用print(radon_image.shape)确认列数,必须等于theta的长度
  • 确认角度拆分逻辑:如果你的子集确实是21个角度,那对应的radon_image必须是列数为21的数组,否则说明投影生成时用的角度数量不对
  • 不要搞反投影维度:部分库的Radon变换返回(num_projections, num_detectors),而iradon要求输入是(num_detectors, num_projections),如果维度搞反会导致列数错误

内容的提问来源于stack exchange,提问作者Vin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 14:34:56