我正在为灰度图像编写自己的强度直方图,其中的数据块被传递到函数中。 这就是我到目前为止所做的:
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个分区,它错过了图像的后半部分,我知道如果bin大小小于256,我需要实现一种将点分组在一起的方法但我不确定如何做到这一点。
答案 0 :(得分: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];
}
鉴于这些是颜色,你可以(如果你选择)应用伽马曲线而不是线性插值。这样做的原因是,如果你想模拟你看到颜色的方式而不是仅仅根据输入数字本身的直方图。两者之间的差异是基于视觉是对数而不是线性的事实,所以线性直方图(特别是如果你使用相对较少的箱子与可能的输入值相比)并不代表我们所看到的非常准确。