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
相关产品推荐
相关产品推荐

