Mat 类型的 OpenCV 最大可能值

Posted

技术标签:

【中文标题】Mat 类型的 OpenCV 最大可能值【英文标题】:OpenCV max possible value of a Mat type 【发布时间】:2017-04-28 04:42:48 【问题描述】:

我想查找是否有一个实用函数或变量可以输出特定 Mat 类型可以采用的最大值。例如,CV_U8 的最大可能值为 255。

示例案例

Matlab 有几个内置函数可以获取任意图像类型的图像并将其转换(必要时进行缩放)为另一种图像类型。

例如,Matlab 有函数im2double。运行help im2double 显示:

Class Support
-------------
Intensity and truecolor images can be uint8, uint16, double, logical,
single, or int16. Indexed images can be uint8, uint16, double or
logical. Binary input images must be logical. The output image is double.

因此它将在 10 种不同的图像类型上运行,并输出具有相同颜色通道数的双图像,通过除以原始数据类型中的最大允许值进行缩放。

因此,如果能够获取输入数据类型的最大值并将其输入到这些函数中,那么 OpenCV 函数 convertTo()normalize() 将能够做同样的事情。

特别是如果可以使用scale = 1/<max_value_of_input_type>normalize(src, dst, alpha, beta, NORM_MINMAX) 将与alpha = <src_min>/<max_value_of_input_type>beta = <src_max>/<max_value_of_input_type> 一起使用,convertTo(dst, type, scale) 的工作方式相同。

【问题讨论】:

Convert uchar Mat to float Mat in OpenCV?的可能重复 @DenizBeker 我不是在问如何在类型已知时转换图像——我在我的问题中引用了这两种方法。我有兴趣转换任意 Mat 类型的图像。 【参考方案1】:

实用函数saturate_cast() 可以执行裁剪到所需类型的最小值和最大值。为了除以任意类型的最大可能值,请使用图像类型在 OpenCV 中可以采用的最大数字,并使用与图像相同的目标类型使其饱和。这适用于未签名的图像。对于有符号值的图像,在正反两面进行饱和,然后移位和缩放。

在此处查看 saturate_cast 的 OpenCV 文档:http://docs.opencv.org/3.1.0/db/de0/group__core__utils.html#gab93126370b85fda2c8bfaf8c811faeaf

编辑:显而易见的解决方案是为不同的可用 Mat 类型编写七个 if 语句:CV_8U、CV_8S、CV_16U、CV_16S、CV_32S、CV_32F、CV_64F,我想这不会太烦人而且更清楚一个读者。

【讨论】:

你还在处理源代码吗?也可以在这里提供源代码。

以上是关于Mat 类型的 OpenCV 最大可能值的主要内容,如果未能解决你的问题,请参考以下文章

怎么求Mat矩阵的最大最小值

《OpenCV:访问Mat图像中每个像素值》

opencv中Mat类型数据操作与遍历

OpenCV中各种类型Mat数据读取

设置Mat、opencv的具体像素值

opencv中16位的矩阵保存成图像,最大灰度值只有32768