gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:37:46 25 4
gpt4 key购买 nike

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

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

所以我的直方图总共有 18*3*3=162 个分区(bins),由每个 channel 的下区间边界组成:

  • 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,这导致一张图像至少需要数百万次迭代。

我的问题是:如何加快此数据结构的速度,以便立即为我的像素找到正确的 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

关于C#:寻求快速数据结构以将像素添加到分区的 HSB 直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5696887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com