local_bimodality — 2D texture op

• 資料種類:image → image

• 呼叫:fullseye.apply(img, "local_bimodality", a=0.5, b=0.5)(2-D 的模型是一張圖 + 兩個純量旋鈕 a,b∈[0,1])

local_bimodality: input → output

*圖為在 128×128 合成輸入上實際執行的輸出。左為輸入,右為輸出。點雲以俯視散點顯示(亮度 = z),一維序列為折線,體資料為沿 z 的最大值投影,影片為中間影格,複數影像為振幅;無法成像的回傳值直接顯示數值。*

掃描旋鈕 a(0.1 / 0.5 / 0.9,另一旋鈕取預設):

▸ local_bimodality: 旋鈕 a 掃描 (文件網站)

掃描旋鈕 b(0.1 / 0.5 / 0.9,另一旋鈕取預設):

▸ local_bimodality: 旋鈕 b 掃描 (文件網站)

換別的影像(合成場景 / 照片 / 硬幣。上排為輸入,下排為對應輸出。旋鈕取預設):

▸ local_bimodality: 其他輸入影像 (文件網站)

*第 4 欄是彩色 (H,W,3) 輸入。此運算子能正確處理顏色而不跨通道(不把顏色通道當作第三個空間軸摺積)。*

用法

局部雙峰性(bimodality coefficient)。連 1 個閾值都不選取,僅以 0〜1 的圖回傳「此處是否分成 2 個值」。

a 將視窗邊長在 9, 15, 25, 41 之間調整(越大估計越穩定,但細的結構會溶入周圍)。b 將對比下限調整為 max(1e-5, 0.25b x 影像值域) ―― 若視窗的標準差低於此值則回傳 0(即使 b=0,1e-5 的絕對下限也會保留)。

BC = (偏度^2 + 1) / 峰度,僅由視窗的 1〜4 階動差(4 次箱型平均)以閉合式求出。對平移和尺度都不變,因此無論淡的紋樣還是濃的紋樣都得到相同的值。參考值由解析解確定,實測也收斂於此(視窗 41):

• 2 點分布(各半的 2 個值)= 1.0(峰度 1 為下限)―― 在階躍正上方實測 1.0000

• 均勻分布 = 5/9 = 0.5556 ―― 以均勻亂數實測 0.5598

• 常態分布 = 1/3 = 0.3333 ―― 以常態亂數實測 0.3306

> 5/9 是「比均勻更尖的 2 個峰」的經典判準。★即使是單峰也不會變成 0 ―― 常態分布的下限是 1/3 而不是 0,因此可用的是 0.33〜1.0 這一帶。

出處及承襲下來的侷限(Pfister, Schwarz, Janczyk, Dale & Freeman 2013, *Frontiers in Psychology* 4:700)。★偏斜的單峰分布會產生偽陽性:在論文的圖中,明顯單峰的分布 BC = 0.73,真正雙峰的分布 BC = 0.67,排序發生了逆轉。因為偏度的絕對值越大,BC 就越高,與峰的個數無關。此 op 也具有相同的性質 —— 單側拖尾的視窗(暗底上只有少量亮點等)會得到高值。不要只憑這 1 項判定雙峰性,應與 local_std 或 otsu 的分離度合併使用。另外,論文的公式帶有樣本校正 (m3^2+1)/(m4 + 3(n-1)^2/((n-2)(n-3))),而此 op 使用母體版(視窗有 81〜1,681 個樣本,校正可忽略。上面的參考值 1/3、5/9、1.0 在母體版中嚴格成立)。

與選擇閾值一側的推廣的關係:Barron (2020) 的 Generalized Histogram Thresholding

(arXiv:2007.07350)把 Otsu、Minimum Error Thresholding、加權百分位閾值作為特例包含在內,對選哪個閾值進行連續內插。此 op 是與之成對的一側,量測閾值究竟是否存在。

為什麼在選擇閾值的 op(otsu / threshold)之前需要它:二值化對任何影像都會回傳答案,但在只有 1 個峰的視窗中會在沒有意義的位置切分(這是 otsu 的 docstring 自己承認的侷限)。此 op 在切分之前回傳「究竟能否分開」,因此可以決定「分不開的地方就不切」。用於判定字元格是否為 1 色底上的 1 色字、板是否被均勻照亮、刮痕是否真的與底色灰階不同。

★下限是必需的。在均勻的面上變異數會變成捨入殘渣,殘渣之間的 3 階、4 階之比會被誤當成結構 ―― 只用相對於影像值域的相對量來設下限的版本,在僅僅是 0.5 單色上疊加振幅 1e-12〜1e-8 殘渣的影像上,BC 的最大值達到 1.0000(值域本身就是殘渣,因此相對下限不起作用)。加上絕對下限 1e-5 後才降到 0(實測)。

不做正規化(值就是 BC 本身),因此可以在影像之間比較。邊緣為反射(mode="reflect")。空影格全為 0。★視窗很大,因此不得分塊處理 (已附理由登記在 scale.py 中)。

詳細使用指南

• gallery2d_texture_freq 族使用指南

參考(範例資料、文獻)

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

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

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

在 Studio 中試試

下面的程式已確認可以執行(與圖相同的輸入)。在 Studio 說明中,此區塊會變成按鈕,可當場載入並執行。

local_bimodality 0.50 0.50

▸ 載入此管線  ·  載入並執行

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

• gallery2d_texture_freq — py -3.11 examples/gallery2d_texture_freq.py

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

identity · gaussian · mean_box · bilateral · unsharp · median · min_filter · max_filter

同類別(texture)

std_filter · local_std · scale_select_std · bootstrap_std_error · structure_tensor_orientation · structure_tensor_coherence · gabor · sk_frangi


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

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