reconstruct op• 데이터 종류: sinogram → image2d
• 호출: import tomography; tomography.filtered_backprojection(sinogram, angles_deg=None, size=None, filter_name='ramp', cutoff=1.0, span_deg=None, _op='filtered_backprojection')(또는 opstomography.get("filtered_backprojection"))
필터 보정 역투영(FBP) —— CT 재구성의 표준.
> 아래 상세 설명은 원문입니다 —— 요약과 제목은 번역되어 있습니다.
Filter each projection along the detector axis with the ramp `|f|` (times an
optional apodisation window), then back-project. This is the discretised
inverse Radon transform, and with enough samples it is exact: reconstructing a
uniform disc of density 1.0 from its analytic sinogram returns an interior
mean of 0.9954 with 363 detector bins and 0.9997 with 727, converging
on the truth as the *detector* is refined and not as the view count is (180,
360 and 720 views give the same 0.9954 to six figures). That absolute value is
what pins the ordinary-versus-angular frequency convention in the ramp: the
other convention, equally defensible and printed in the same textbooks, would
return `2*pi` times this, and a CT slice has no absolute grey level for
anyone to notice against.
Where it breaks, measured on the Shepp-Logan phantom (256 px, analytic
sinogram so the projector contributes no error of its own; normalised RMS
error against the truth):
views FBP (ramp) SART (10 sweeps) FBP/SART
180 0.0250 0.0175 1.43
90 0.0454 0.0195 2.33
45 0.1039 0.0353 2.95
32 0.1362 0.0497 2.74
16 0.2341 0.0859 2.72
8 0.3635 0.1257 2.89
**There is no crossing point, and the expectation that there would be one was
wrong.** The received story is that FBP wins when the data is complete and
loses only in the sparse regime; measured here, SART with a non-negativity
constraint is better at *every* view count — by 1.43x at 180 views and by
about 2.9x once the scan is sparse. What changes with the view count is the
price, not the ranking: at 180 views SART costs 312x the wall clock
(37.7 s against 0.12 s for a 256-px slice) to buy that 1.43x, which is why
filtered back-projection is what production scanners run. At the sparse end
the same 2.9x comes nearly free, because both methods scale with the views.
With noise the ranking holds but the margins change, and the apodisation
windows stop being decoration (Poisson counts at `I0 = 2e4`, same phantom):
views FBP ramp FBP hann SART (10 sweeps)
180 0.0360 0.0371 0.0291
45 0.1159 0.0766 0.0385
16 0.2481 0.1921 0.0864
8 0.3813 0.3093 0.1259
At 180 views the exact ramp beats Hann — the data is complete and the roll-off
only blurs. At 45 views and below Hann beats the exact inverse by up to 1.5x,
because the frequencies the ramp is busy amplifying were never measured.
Filters, and what they trade: `"ramp"` is the exact inverse and therefore
the sharpest and the noisiest; `"shepp-logan", "cosine", "hann"` and
`"hamming"` roll the high frequencies off, in that order of aggressiveness.
`"none" skips the filter entirely and gives :func:backproject_sinogram`.
:param sinogram: `(n_angles, n_detectors)`, rows = angles.
:param angles_deg: view angles in degrees; `None -> uniform [0, 180)`
with one view per row.
:param size: output side; `None` -> the inscribed square.
:param filter_name: one of :data:FILTERS.
:param cutoff: fraction of Nyquist to keep, `(0, 1]`.
:param span_deg: angular range for the `d(theta) weight; None` -> the
range the views actually cover, inferred from the angle list (exact for
a uniform grid over any span and for any full-coverage irregular set
such as golden angle; see :func:_span_weight).
:returns: `(size, size)` float64 image.
:raises ValueError: on a non-2-D or non-finite sinogram, an angle count that
disagrees with the row count, an unknown filter, a cutoff outside
`(0, 1], or an output over :data:MAX_IMAGE_ELEMENTS`.
• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL URL.
• 연산자의 내력·참고문헌 —— 이 연산자 족의 바탕이 된 연구/기법의 출처.
• 알고리즘의 정전(저자·연도)과 용도는 위의 패밀리 사용 가이드에 적혀 있습니다.
• ct_reconstruction — py -3.11 examples/ct_reconstruction.py
image2d 를 입력으로 받는 것)reconstruct)backproject_sinogram · sart_reconstruct
*Provenance: tomography.py — TOMOGRAPHY 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.