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() 的功能:

  1. 数据类型转换: 将输入的矩阵或图像转换为指定的目标数据类型。

  2. 线性变换: 对每个像素进行线性变换,应用公式如下:

    \[\text{dst}(x, y) = \alpha \times \text{src}(x, y) + \beta \]

    • src(x, y) 为输入矩阵中 (x, y) 坐标下的像素值。
    • dst(x, y) 为输出矩阵中 (x, y) 坐标下的像素值。
    • alpha 是缩放因子,beta 是偏移量。


3. 示例

  1. 基本使用:将浮点图像转换为 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;
}
  1. 应用线性变换:同时执行数据类型转换和线性变换。例如,将浮点图像缩放为 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. 典型应用

  1. 图像缩放cv::Mat::convertTo() 常用于将图像数据从一种类型转换到另一种类型,同时进行缩放。例如,从浮点类型转换到 8 位无符号整数类型(CV_8U),或从 16 位整数转换到浮点类型(CV_32F)。

  2. 亮度和对比度调整:通过调整 alphabeta 来调节图像的亮度和对比度。例如,增加 alpha 会使图像的对比度更高,而增加 beta 会使图像更亮。

  3. 数据类型转换:在图像处理的不同阶段,可能需要将图像从一种数据类型转换为另一种类型。例如,将输入图像转换为浮点数进行滤波处理,最后再转换回 8 位整数进行显示。



5. 总结

cv::Mat::convertTo() 是一个多功能函数,它不仅可以用来进行数据类型的转换,还能对图像进行线性变换,如缩放和加偏移操作。在图像处理中,该函数用于从浮点数、16 位整数等数据类型转换到 8 位无符号整数的常见任务,也可以用于调节图像的亮度和对比度。



6. convertTo()setTo() 的区别

  • cv::Mat::setTo(): 主要用于将图像的像素值设置为一个固定的值,可以选择性地用掩码控制赋值范围。
  • cv::Mat::convertTo(): 主要用于图像的类型转换和执行线性变换(缩放和偏移),多用于数据格式的转换和亮度、对比度的调整。

两者的作用不同,setTo 是用来直接设置像素值,而 convertTo 则是用于像素值的转换和变换。



posted @ 2024-01-03 11:19  做梦当财神  阅读(1319)  评论(0编辑  收藏  举报