我有一个48位(每像素16位)的图像,我加载了FreeImage。我试图从这个图像生成直方图,而不必将其转换为24位图像。
这就是我理解直方图的计算方法。
for (pixel in pixels)
{
red_histo[pixel.red]++;
}
pixel.red
可以在0到255之间。因此我的直方图上有0到255的范围。但如果每像素有16位,则可能介于0和65535之间,这太大而无法在直方图上显示。
是否有标准的方法来计算48位(或更高)图像的直方图?
答案 0 :(得分:0)
这Stack Overflow Question可能有你想要的答案。
我不知道是否有“标准”方式。
答案 1 :(得分:0)
如果这是出于显示目的,您可以缩小像素以保持范围从0到255,例如:
double scalingFactor = 255/65535;
for (pixel in pixels)
{
red_histo[(int)(scalingFactor * pixel.red)]++;
}
这将允许16位像素的上限范围在255处,而16位像素的下限范围在0处。
答案 2 :(得分:0)
你必须决定直方图中需要多少个箱子。例如。 Matlab直方图函数采用这些形式
imhist(I) imhist(I,n) imhist(X,map)
在第一种情况下,bin的数量默认使用为256.因此,如果你有16位输入,这些将被缩减为8位并分成256个bin直方图。
在第二个中,您可以指定箱数'n'。假设您为16位数据指定n = 2。然后,这将基本上将直方图分割为[0-2 ^ 15,2 ^ 15-2 ^ 16-1]。
第三种情况是您为每个bin指定地图。即你必须指定每个bin的像素值范围。
http://www.mathworks.com/help/images/ref/imhist.html
您希望如何选择垃圾箱数量取决于您的要求。