ncd — IMGMETRICS compression op

• 資料種類:image2d × image2d → scalar

• 呼叫: import fullseye as fs; fs.ledger.ncd(a, b, compressor='lzma', levels=None, data_range=None, symmetric=True)(要直接呼叫實作,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 族使用指南

參考(範例資料、文獻)

• 範例資料目錄(下載 URL / 授權) —— 2-D 用 skimage.data(BSD/公有領域)加合成圖,3-D 給出真實資料源(Stanford/PDS 等)的下載 URL。

• 運算子來歷與參考文獻 —— 該運算子族所依據的研究/方法出處。

• 演算法的正典(作者、年份)與用途見上面的族使用指南。

可執行的範例(實際呼叫該運算子並已驗證的樣例)

• image_quality_metrics — py -3.11 examples/image_quality_metrics.py

型別可銜接的下一個運算子(可接受 scalar 作為輸入)

luma_limited_u8 · rank_data · tid2013_index

同類別(compression)

compressed_size


*Provenance: imgmetrics.py — IMGMETRICS 運算子登記表。本條目由 tools/opdocs.py md 自動產生(請勿手動編輯)。*

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