【问题标题】:Intensity Histogram ++强度直方图 ++
【发布时间】:2015-12-16 16:56:01
【问题描述】:

我正在为灰度图像编写自己的强度直方图,其中将 bin 的数量传递给函数。 这是我到目前为止所拥有的:

std::vector<unsigned int> Image::histogram(const int bins)
{
std::vector<unsigned int> histogram(bins ,0);
for (unsigned int i(0); i < bins; i++)
{
    for (unsigned int j(0); j < m_height * m_width; ++j)
    {
        if (i == m_p_image[j])
        {
            histogram[i]++;
        }
    }
}
return histogram;
}

这非常适用于 256 个 bin,因为每个计数都添加到直方图中,但是对于 128 个 bin,它会错过图像的后半部分,我知道如果 bin 大小小于 256,我需要实现一种将点分组在一起的方法但我不确定该怎么做。

【问题讨论】:

    标签: c++ image-processing histogram


    【解决方案1】:

    你的代码让我觉得不必要的笨拙。没有真正需要外循环。

    但是,要回答您提出的问题,通常的方法是使用线性插值 - 即在输入范围内找到一个值的比例位置,然后在输出中增加相同的比例位置范围。

    for (j =0; j<height * width; j++) {
        double input_pos = image[j] / 256.0;
        int output_pos = int(input_pos * bin_count);
        ++histogram[output_pos];
    }
    

    鉴于这些是颜​​色,您可以(如果您选择)应用伽马曲线而不是进行线性插值。这样做的原因是,如果您想模拟您如何看待颜色,而不是仅仅将直方图基于输入数字本身。两者之间的差异基于这样一个事实,即视觉是对数而不是线性的,因此线性直方图(特别是如果您使用与可能输入值的数量相比相对较少的 bin)并不能代表我们所看到的非常准确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-29
      • 2021-11-26
      • 1970-01-01
      • 2013-06-22
      • 2019-07-07
      相关资源
      最近更新 更多