c++ - 强度直方图++

标签 c++ image-processing histogram

我正在为灰度图像编写自己的强度直方图,其中将 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,我需要实现一种将点分组在一起的方法但我不确定该怎么做。

最佳答案

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

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

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

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

关于c++ - 强度直方图++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34317732/

相关文章:

c++ - float 的符号

c++ - C++ Linux 中的线程无限期等待

c# - 如果未设置图像的 DPI,WPF/WIC,如何找到它?

image-processing - 使用特征向量进行图像重建

python - Gnuplot : Histogram - How do i swap x and y axis?

r - ggplot 中的直方图在 X 轴上不是从零开始

python - 大型数组的 Numpy 直方图

C++ 整数类型是给定类型宽度的两倍

c++ - 智能指针 : Does a 'base' part of an object get created?

c++ - CImg get_crop() 返回错误的像素/获取 CImg 的子图像