flat_field_correct — AOI photometric op

• 데이터 종류: image2d × image2d → image2d

• 호출: import fullseye as fs; fs.ledger.flat_field_correct(image, flat, dark=None, target=None, min_response=None, clip=True)(구현을 직접 호출하려면 import aoi; aoi.flat_field_correct(image, flat, dark=None, target=None, min_response=None, clip=True), 원장에서 가져오려면 opsaoi.get("flat_field_correct"))

• GPU: 없음(CPU 참조 구현만)

사용법

조명 불균일과 센서 감도 편차를 암전류를 뺀 나눗셈으로 되돌린다. → 보정된 영상.

> 아래 상세 설명은 원문입니다 —— 요약과 제목은 번역되어 있습니다.

検査画像 I、フラット画像(一様な面を撮ったもの)F、暗画像(遮光して撮ったもの) D から::

out = (I - D) / (F - D) * target

target の既定は mean(F - D)。このとき返る絵は 真の反射率 x mean(F - D) に厳密に等しい(実測の差 8.3e-17)。target=1.0 を渡せば反射率そのものへ戻る。

★「入力の明るさが保たれる」とは書かない。 既定で保たれるのは*尺度*であって平均ではない —— 被写体と感度分布に相関があると平均はずれる。実測(下と同じ合成系):

mean(raw - dark) = 0.109256 に対し mean(out) = 0.099548 で 8.9 % 低い。暗いところほど感度も低い、というありふれた配置でこうなる。

暗電流を無視すると戻らない。 D を省くと D = 0 として扱うが、実際に暗電流がある系ではそれは誤りで、補正後も勾配が残る。実測(cos⁴ 型のビネットで隅の感度が中心の 0.196 倍、暗電流 0.05、target=1.0):

=========================== ===================== ======================

量 dark を渡す dark を省く

=========================== ===================== ======================

真値との最大相対誤差 1.755e-16 2.252e-01

隅 / 中心の明るさの比 0.1209(真値と一致) 0.4867(真値 0.1209)

=========================== ===================== ======================

誤差の比は 1.3e+15 倍。しかも省いた側も絵としては破綻せず「それらしく」出る —— 隅が明るいまま残るだけなので、目では合格に見えて数字だけが狂う。この 2 行は tests/test_aoi.py::test_flat_field_without_dark_does_not_recover が固定しており、式が本当に D を使っている証拠でもある。

参考: 引き算で照明ムラを取る background_flatten(低次曲面の当てはめ)を同じ絵に当てると、隅 / 中心の比は 0.6436(真値 0.1209)にしかならない。掛け算で効く感度ムラは、引き算では戻らない。

ゼロ割りは黙って通さない(既定は fail-closed)。 F - D に 0 以下の画素があると ValueError を送出する。「そこは応答が無い画素」だと分かっていて先へ進めたいときだけ、min_response に明示の下限(正の実数)を与える —— そのとき応答はその値で下から抑えられ、割り算は有限に保たれる。既定で下限を置かないのは、下限を既定にすると「死んだ画素の上に、それらしい値が生える」ことが黙って起きるため。

Args:

image: 検査画像 (H, W)。

flat: フラット画像 (H, W)。image と同じ形。

dark: 暗画像 (H, W)、一様な暗電流を表す実数 1 つ、または None

(= 暗電流 0 として扱う。その仮定が誤りなら補正は戻らない —— 下の門を参照)。

target: 補正後の基準レベル。None なら mean(flat - dark)。

min_response: flat - dark の下限(正)。None なら 0 以下を拒否する。

clip: True(既定)なら結果を [0, 1](この library の画像の約束)へ丸める。

飽和はここで起きるので、生の値が要るなら False にする。

Returns:

(H, W) float64。clip=True なら値域は [0, 1]、clip=False なら

入力しだいで 1 を超えうる。dtype はどちらでも float64。

Raises:

ValueError: 形が違う / 2-D でない / 非有限 / flat - dark が 0 以下

(min_response 未指定時)/ min_response や target が正の有限でない。

자세한 사용 가이드

• aoi_frontend 패밀리 가이드

참고(샘플 데이터·문헌)

• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL URL.

• 연산자의 내력·참고문헌 —— 이 연산자 족의 바탕이 된 연구/기법의 출처.

• 알고리즘의 정전(저자·연도)과 용도는 위의 패밀리 사용 가이드에 적혀 있습니다.

실행 가능한 예제(이 연산자를 실제로 호출하는 검증된 샘플)

• aoi_frontend_tour — py -3.11 examples/aoi_frontend_tour.py

타입이 이어지는 다음 연산자(image2d 를 입력으로 받는 것)

register_image · tiled_map · center_from_symmetric_edges · reflection_axis · rotational_symmetry · symmetry_difference_map · symmetry_score

같은 카테고리(photometric)

—


*Provenance: aoi.py — AOI 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.