2015-12-16 63 views
1

我正在为灰度图像写入我自己的强度直方图,其中箱的数量传递到函数中。 这是我到目前为止有:强度直方图++

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,但是我不确定如何执行此操作,将点组合在一起的方法。

回答

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

鉴于这些颜色,你可能(如果您选择)应用伽玛曲线,而不是做线性插值。这样做的理由是,如果你想模拟你看到颜色的方式,而不是直接在输入数字本身上建立直方图。两者之间的差异是基于这样一个事实,即视觉像对数而不是线性,所以线性直方图(特别是如果您使用相对较少的箱子与可能的输入值的数量相比)并不代表我们所看到的非常准确。