OpenCV(cv::Mat::convertTo())
cv::Mat::convertTo()
是 OpenCV 中用于将图像或矩阵转换为另一种数据类型的函数。同时还可以执行线性变换(缩放和偏移)。
1. 函数原型
void cv::Mat::convertTo(OutputArray dst, int rtype, double alpha = 1, double beta = 0) const;
参数:
dst
(输出参数): 目标输出矩阵或图像,数据类型由rtype
决定。rtype
: 输出矩阵的类型,通常使用CV_8U
,CV_16U
,CV_32F
,CV_64F
等标识符。如果rtype
为-1
,则表示输出矩阵将与输入矩阵的数据类型相同。alpha
: 缩放因子,表示输出值会乘以该因子(默认值为1
)。beta
: 偏移量,表示输出值会加上该偏移量(默认值为0
)。
2. 工作原理
cv::Mat::convertTo()
的功能:
-
数据类型转换: 将输入的矩阵或图像转换为指定的目标数据类型。
-
线性变换: 对每个像素进行线性变换,应用公式如下:
\[\text{dst}(x, y) = \alpha \times \text{src}(x, y) + \beta \]src(x, y)
为输入矩阵中(x, y)
坐标下的像素值。dst(x, y)
为输出矩阵中(x, y)
坐标下的像素值。alpha
是缩放因子,beta
是偏移量。
3. 示例
- 基本使用:将浮点图像转换为 8 位无符号整数图像,并将每个像素值缩放到
[0, 255]
范围内。
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
// 读取浮点图像
Mat img = imread("image.png", IMREAD_GRAYSCALE);
img.convertTo(img, CV_32F, 1.0 / 255.0); // 将像素值转换为0-1范围内的浮点数
// 转换回8位图像,缩放回0-255范围
Mat result;
img.convertTo(result, CV_8U, 255);
imshow("Result", result);
waitKey(0);
return 0;
}
- 应用线性变换:同时执行数据类型转换和线性变换。例如,将浮点图像缩放为 0 到 255 范围,并应用偏移量。
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
// 创建一个浮点矩阵
Mat img = (Mat_<float>(2, 2) << 0.5, 1.0, 1.5, 2.0);
// 转换为8位无符号整数,并缩放为0-255范围,加上偏移量50
Mat result;
img.convertTo(result, CV_8U, 100, 50); // result = img * 100 + 50
std::cout << "Result:\n" << result << std::endl;
return 0;
}
Result:
[100, 150;
200, 250]
3.1 参数应用
alpha
: 用于调整图像的亮度和对比度。例如,将图像的亮度增加可以通过调整beta
实现,而改变对比度则可以通过调整alpha
实现。beta
: 可以用于将图像进行偏移,通常在调整亮度时使用。例如,增加beta
会使图像整体变亮,而减少beta
会使图像变暗。
4. 典型应用
-
图像缩放:
cv::Mat::convertTo()
常用于将图像数据从一种类型转换到另一种类型,同时进行缩放。例如,从浮点类型转换到 8 位无符号整数类型(CV_8U
),或从 16 位整数转换到浮点类型(CV_32F
)。 -
亮度和对比度调整:通过调整
alpha
和beta
来调节图像的亮度和对比度。例如,增加alpha
会使图像的对比度更高,而增加beta
会使图像更亮。 -
数据类型转换:在图像处理的不同阶段,可能需要将图像从一种数据类型转换为另一种类型。例如,将输入图像转换为浮点数进行滤波处理,最后再转换回 8 位整数进行显示。
5. 总结
cv::Mat::convertTo()
是一个多功能函数,它不仅可以用来进行数据类型的转换,还能对图像进行线性变换,如缩放和加偏移操作。在图像处理中,该函数用于从浮点数、16 位整数等数据类型转换到 8 位无符号整数的常见任务,也可以用于调节图像的亮度和对比度。
6. convertTo()
与 setTo()
的区别
cv::Mat::setTo()
: 主要用于将图像的像素值设置为一个固定的值,可以选择性地用掩码控制赋值范围。cv::Mat::convertTo()
: 主要用于图像的类型转换和执行线性变换(缩放和偏移),多用于数据格式的转换和亮度、对比度的调整。
两者的作用不同,setTo
是用来直接设置像素值,而 convertTo
则是用于像素值的转换和变换。