0

我有一个用 FreeImage 加载的 48 位(每像素 16 位)图像。我正在尝试从此图像生成直方图,而无需将其转换为 24 位图像。

这就是我理解直方图的计算方式..

for (pixel in pixels)
{
    red_histo[pixel.red]++;
}

哪里pixel.red可以在 0 到 255 之间。所以我的直方图上有一个从 0 到 255 的范围。但是如果每个像素有 16 位,它可能在 0 到 65535 之间,这太大而无法显示在直方图上。

有没有标准的方法来计算 48 位(或更高)图像的直方图?

4

3 回答 3

0

这个堆栈溢出问题可能有您正在寻找的答案。

我不知道是否有“标准”方式。

于 2013-05-15T14:35:02.023 回答
0

如果这是出于显示目的,您可以缩小像素以保持范围为 0-255,例如:

double scalingFactor = 255/65535;
for (pixel in pixels)
{
    red_histo[(int)(scalingFactor * pixel.red)]++;
}

这将允许 16 位像素的上限为 255,而 16 位像素的下限为 0。

于 2013-05-15T19:24:51.393 回答
0

您必须决定直方图中需要多少个 bin。例如。Matlab 直方图函数采用这些形式

imhist(I) imhist(I, n) imhist(X, 地图)

在第一种情况下,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

您想如何选择垃圾箱的数量取决于您的要求。

于 2013-05-15T19:39:00.513 回答