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.