C#:寻求快速数据结构以将像素添加到分区 HSB 直方图

2024-01-06

在我的应用程序中,我使用快速非托管代码从多个图像读取 RGB 像素值,然后将它们转换为 HSB 颜色。现在我想使用以下分区构建 HSB 直方图:

  • 色调:18 个分区,从 0...360 产生 20 个间隔
  • 饱和度:3 个分区,从 0...1 产生 0,33 的间隔
  • 亮度:3 个分区,从 0...1 产生 0.33 的间隔

所以我的直方图总共有 18*3*3=162 个分区(箱),其中包含每个通道的下区间边界:

  • Bin1: [0, 0, 0]
  • Bin2: [0, 0, 0.33]
  • Bin3: [0, 0, 0.66]
  • Bin4: [0, 0.33, 0]
  • Bin5: [0, 0.33, 0.33]
  • ...
  • Bin162: [340, 0.66, 0.66]

我假装每个 bin 本身都是 HSB 颜色来实现这一点。因此,我计算了 bin 间隔边界,根据这些值创建了 HsbColor 实例,并将颜色(包装在 HsbHistogramBin 类中)放入一个简单列表中。 当向直方图中添加新的 HsbColor 时,我使用以下代码来确定需要增加哪个 bin:

private HsbHistogramBin FindBin(HsbColor color)
{
    HsbHistogramBin bin = null;
    bool foundBin = false;
    for (int i = Bins.Count - 1; i >= 0; i--)
    {
        bin = Bins[i];
        if (bin.Color.Hue > color.Hue)
            continue;
        if (bin.Color.Saturation > color.Saturation)
            continue;
        if (bin.Color.Brightness > color.Brightness)
            continue;
        foundBin = true;
        break;
    }
    return foundBin ? bin : null;
}

public void AddColor(HsbColor color)
{
    FindBin(color).Value++;
}

显然这太慢了。在最坏的情况下,每个像素需要 162 次迭代才能找到其 bin,这会导致一张图像至少需要数百万次迭代。

我的问题是:如何加快这个数据结构的速度,以便我可以立即找到适合我的像素的容器?长度为 162 的简单数组可能有效,但如何计算尚未缩减为上述分区且可能包含 [259.234, 0.5634, 0.90534] 等值的给定像素的正确 bin 索引?


为什么不直接使用 3 维数组呢?就像这样:

int[,,] histogram = new int[18, 3, 3];

// initialize to 0
for(int h = 0; h < 18; h++) {
  for(int s = 0; s < 3; s++) {
    for(int b = 0; b < 3; b++) {
      histogram[h, s, b] = 0;
    }
  }
}

// foreach pixel...
HsbColor c = ... // color of pixel
int h = (int)(c.Hue / 20);
int s = (int)(c.Saturation * 3);
int b = (int)(c.Brighthess * 3);

// take care of boundary cases (Hue, Saturation or Brightness maxed out)
if(h >= 18) h = 17;
if(s >= 3) s = 2;
if(b >= 3) b = 2;

histogram[h, s, b]++;

注意:我在这里假设您的总像素数(更准确地说,落入 1 个 bin 的最大像素数)不会超过int.MaxValue。否则,请考虑使用long直方图的数据类型而不是int.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#:寻求快速数据结构以将像素添加到分区 HSB 直方图 的相关文章

随机推荐

  • 更改表主键 - Crate DB

    我想更改我的表Crate DB更改主键约束以向现有列添加一列 如果我需要删除约束并创建一个新约束 那么 SQL 语法是什么 我一直在尝试传统的 SQL 语法 但它似乎不起作用 alter table my data table drop p
  • 正测试用例和负测试用例

    什么是阳性测试用例 and 负面测试用例 在谷歌上搜索后 我发现了非常令人困惑的答案 谁能用例子解释一下吗 积极的测试用例测试系统是否做了它应该做的事情 示例 提供有效凭据后将允许您登录 负面测试用例测试系统没有做不应该做的事情 示例 当提
  • 用pynsist打包PyGObject Python 3程序?

    我想用 pynsist 打包一个 Python3 PyGObject 程序 该存储库有一个 PyGTK 的示例 它让我认为更改该示例应该不会太难 该示例可以在这里找到 https github com takluyver pynsist t
  • 如何判断 xyY 颜色是否位于 CIE 1931 色域内?

    我正在尝试使用数学绘制 CIE 1931 色域 我采用 xyY 颜色 其中 Y 固定为 1 0 然后将 x 和 y 从 0 0 更改为 1 0 如果我将生成的颜色绘制为图像 即 x y 处的像素是我转换为 RGB 的 xyY 颜色 我会得到
  • 闭包/范围 JavaScript/jQuery

    我正在尝试将一些现有的顶级函数分组到一个 闭包 以避免污染全局名称空间 但我不太明白 让它发挥作用 首先 所有 JS 在我的匿名函数之外工作 但是一旦我把 它在匿名函数中我得到一个错误 交叉淡入淡出不是 定义 有没有人看到我的任何完全明显的
  • C# 获取时出现一些错误

    private void TxtFarmerCode TextChanged object sender EventArgs e try cmd Open cmd new SqlCommand Select farmername from
  • 尝试更新我的 Intellij 时出现 OutOfMemory 错误

    我正在尝试将 IntelliJ IDEA 从内部版本 141 177 更新到 141 178 当更新下载所有需要的文件并开始更新时 我收到此错误 Temp directory tmp java lang OutOfMemoryError J
  • 从数据框中选择和分组双类别数据

    我真的需要关于如何解决问题的帮助 我有一个看起来像这样的数据集 Name Sex Total Anna F 10 Jamie M 2 Jamie F 7 Mike M 13 Sam F 6 Sam M 3 structure list Na
  • Android:在canvas api中使用渐变填充颜色绘制圆弧

    我想使用渐变填充使用画布绘制圆弧 如何才能实现这一点呢 嘿 我从这里偷了这个 在 Android 中使用 SweepGradient 绘制圆弧 https stackoverflow com questions 4786318 draw a
  • glDrawArrays 之间的 glBufferSubData 调用重整数据

    这好像是glBufferSubData正在覆盖或以某种方式破坏我之间的数据glDrawArrays来电 我正在使用 Windows 7 64 位操作系统 并使用适用于我的 Nvidia GeForce GT520M CUDA 1GB 的最新
  • 禁用或删除 apc

    我在 ubuntu 11 04 linux 上安装了 APC 我想进行一些性能基准测试 看看没有 APC 的 PHP 的速度有何改进 但我不知道如何禁用 删除 APC 我尝试清空 apc ini 文件 但没有成功 尽管如此 在我第一次加载页
  • 使用 UIModalPresentationFormSheet 的模态视图出现在屏幕外

    我有一个 UIViewController 实现 BOOL shouldAutorotateToInterfaceOrientation UIInterfaceOrientation interfaceOrientation Return
  • 身份服务器 4 上出现“客户端密钥验证失败”错误

    我正在尝试使用 client credentials 从我的 Identity Server 4 获取访问令牌 我想我几乎通过搜索完成了 Google 页面 但我什么也没找到 所以 请 这是我的 GetClients 方法 My PostM
  • SQL Server:为什么默认情况下禁用 xp_cmdshell?

    默认情况下禁用扩展存储过程 xp cmdshell 的安全原因是什么 您可以在中找到解释PermissionsSQL Server 部分文档 http msdn microsoft com en us library ms175046 as
  • Coldfusion 将 onRequestEnd() 与 Application.cfm 文件结合使用

    我正在使用一个遗留应用程序工作 该应用程序是基于使用Application cfm文件而不是Application cfc files 需要能够在请求处理后运行代码 基本上 我想使用
  • django-storages 获取完整的 S3 url

    我有几个课程使用 django storages 和 Amazon S3 class Cache models Model identifier models TextField blank True null True cache fil
  • python 中的 p5-js map() 函数

    python中有没有像p5 js的map 这样的函数 python 中的 map 根本不一样 据我了解 在 python 中 它对序列中的所有可迭代应用相同的函数 但我需要一些可以完成 p5 js 中的 map 函数功能的东西 感谢您的帮助
  • 如何找到使用 gdb 定义的文件?

    当我打字时list mystruct进入 gdb 我收到用于定义 mystruct 的代码行 我怎样才能要求 gdb 给我它正在读取的文件来打印这些行 从 gdb python 接口获取该文件会更好 越容易解析越好 Thanks 为了显示类
  • 从输入中获取整数值并动态生成输入

    我想在焦点从 移开 时动态获取输入End Date 输入并传递天数到 JQuery 并生成它 我尝试了这段代码但不起作用 从几天中获取价值并生成面板数量 就是这样
  • C#:寻求快速数据结构以将像素添加到分区 HSB 直方图

    在我的应用程序中 我使用快速非托管代码从多个图像读取 RGB 像素值 然后将它们转换为 HSB 颜色 现在我想使用以下分区构建 HSB 直方图 色调 18 个分区 从 0 360 产生 20 个间隔 饱和度 3 个分区 从 0 1 产生 0