ncd — IMGMETRICS compression op

데이터 종류: image2d × image2dscalar

호출: import imgmetrics; imgmetrics.ncd(a, b, compressor='lzma', levels=None, data_range=None, symmetric=True)(또는 opsimgmetrics.get("ncd"))

사용법

정규화 압축 거리(Li, Chen, Li, Ma & Vitányi, IEEE TIT 50(12), 2004).

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

`NCD(x,y) = (C(xy) - min(C(x),C(y))) / max(C(x),C(y))`。

同じものなら 0 に近づき、無関係なら 1 に近づく ―― ただし **実際の圧縮器は

理想的な Kolmogorov 複雑度ではない**ので、同一入力でも厳密に 0 にはならない

(ヘッダぶんの下駄がある)。その下駄の実測値はテストに残してある。

生の float 配列は受け付けない。 圧縮器はバイト列の繰り返しを見るので、

値がごくわずか違うだけで float の仮数部が総取っ替えになり、**似ている 2 枚

でも共通のバイト列が消える**。実測(2026-09-02、`linspace` の勾配と

それを +0.02 した絵、PSNR 34.0 dB = よく似ている):

• `float64` のまま:8 バイト語の共有率 0.02 %NCD 1.0959

(「まったく無関係」と読める値。しかも 1 を超える)

• 256 段に量子化:NCD 0.1290(正しく「よく似ている」)

• 本当に無関係な 2 枚:NCD 0.9981

つまり float のまま測ると例外なく逆の結論が出る。よって float には

`levels の明示を要求する(levels=256 なら data_range` を 256 段に

量子化してから測る)。整数 dtype はそのまま測れる。

`symmetric=True`(既定)は 両向きを測って平均する。圧縮器は前から順に

辞書を作るので `C(xy) != C(yx)` になり、素朴に実装すると「距離」を名乗り

ながら引数の順で値が変わる(実測: 縦縞と横縞で 0.571429 対 0.595238、

相対 4 %)。**一様乱数どうしでは差 0.000e+00 になるので、乱数で試している

限り気づけない** ―― 構造のある実データで初めて破れる型の欠陥。

자세한 사용 가이드

image_difference_metrics 패밀리 가이드

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

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

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

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

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

image_quality_metricspy -3.11 examples/image_quality_metrics.py

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

같은 카테고리(compression)

compressed_size


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

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