如何在OPenCV中计算32位浮点图像的图像直方图

3

我想计算一张图像的直方图,它的像素类型是32位浮点型。对于“calcHist”函数,以下应该是参数的值: - dims:图像的维度数,应为1。 - bins:直方图中每个bin的数量,可以自行设置。 - range:像素强度值的范围,应在[0, 1]之间。


不用等待。首先解释一下,你会如何将浮点数据进行舍入? - undefined
这是问题。浮点数意味着值介于0和1之间,并且可能有数百万个可能的值。 - undefined
有一个OpenCV函数可以将32F类型的Mat映射到无符号字符类型的Mat。然后,你可以直接调用calcHist函数。它会给你一个直方图的近似值,可能已经足够满足你的需求了。 - undefined
那是哪个函数? - undefined
转换为:http://docs.opencv.org/doc/user_guide/ug_mat.html。你本可以做一些基础的研究来找到这个。 - undefined
1个回答

7

我已经多次这样做过。大致如下:

cv::Mat matSrc;    // this is a CV_32FC1 normalised image

int nHistSize = 65536;
float fRange[] = { 0.0f, 1.0f };
const float* fHistRange = { fRange };

cv::Mat matHist;
cv::calcHist(&matSrc, 1, 0, cv::Mat(), matHist, 1, &nHistSize, &fHistRange);

作为文档中所述(点击此处阅读),描述源数组:
引用: 源数组。它们都应该有相同的深度,CV_8U或CV_32F,并且具有相同的大小。它们中的每一个都可以具有任意数量的通道。
因此,支持CV_32F。在这种情况下,范围(例如我的示例中的0.0到1.0)被分成所需的bin数(例如我的示例中的65536)。

2
这会对具有全强度像素(即1.0)的图像产生问题,因为上限范围是“排除的”参考文档。相反,你可以尝试使用float fRange[] = { 0.f, 1.f + FLT_EPSILON };来解决这个问题。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接