强度直方图++

Intensity Histogram ++

本文关键字:直方图      更新时间:2023-10-16

我正在为灰度图像编写我自己的强度直方图,其中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个仓非常有效,但对于128个仓,它错过了图像的后半部分,我知道如果仓大小小于256,我需要实现一种将点分组在一起的方法,但我不确定如何做到这一点。

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

然而,要回答你问的问题,通常的方法是使用线性插值——也就是说,找到一个值在输入范围内的比例位置,然后在输出范围内增加相同的比例位置。

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];
}

假设这些是颜色,可以(如果选择)应用伽玛曲线,而不是进行线性插值。这样做的原因是,如果你想对你如何看待颜色进行建模,而不仅仅是基于输入数字本身的直方图。两者之间的区别是基于这样一个事实,即视觉是对数的,而不是线性的,因此线性直方图(尤其是如果与可能的输入值数量相比,你使用的仓相对较少)不能非常准确地代表我们所看到的。