• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

opencv 三 Mat的基本操作2图像读取保存、颜色空间、裁剪、缩放、旋转

武飞扬头像
摸鱼的机器猫
帮助1

Opencv中对彩色图的操作同样可以应用于灰度图和二值图,彩色图与灰度图直接的区别在于颜色类型空间类型的不同,这里以彩为操作示例。RGB、BGR、LAB、HSV是常见的3通道(CV_8UC3、CV_32FC3)彩色图类型,灰度图通常是一个通道的图像,二值图的数据类型与灰度图是一样的(CV_8UC1)。

一、读取|保存图像

imread函数用于读取图像,imread( const String& filename, int flags = IMREAD_COLOR ),flags的默认值为IMREAD_COLOR,也就是说默认读取为三通道BGR图像。完整的图像加载模式如下所示,0表示读取为灰度图。

  1.  
    IMREAD_UNCHANGED = -1, //!< If set, return the loaded image as is (with alpha channel, otherwise it gets cropped). Ignore EXIF orientation.
  2.  
    IMREAD_GRAYSCALE = 0, //!< If set, always convert image to the single channel grayscale image (codec internal conversion).
  3.  
    IMREAD_COLOR = 1, //!< If set, always convert image to the 3 channel BGR color image.
  4.  
    IMREAD_ANYDEPTH = 2, //!< If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit.
  5.  
    IMREAD_ANYCOLOR = 4, //!< If set, the image is read in any possible color format.
  6.  
    IMREAD_LOAD_GDAL = 8, //!< If set, use the gdal driver for loading the image.
  7.  
    IMREAD_REDUCED_GRAYSCALE_2 = 16, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/2.
  8.  
    IMREAD_REDUCED_COLOR_2 = 17, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/2.
  9.  
    IMREAD_REDUCED_GRAYSCALE_4 = 32, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/4.
  10.  
    IMREAD_REDUCED_COLOR_4 = 33, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/4.
  11.  
    IMREAD_REDUCED_GRAYSCALE_8 = 64, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/8.
  12.  
    IMREAD_REDUCED_COLOR_8 = 65, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/8.
  13.  
    IMREAD_IGNORE_ORIENTATION = 128 //!< If set, do not rotate the image according to EXIF's orientation flag.
  14.  
     

imwrite用于保存图像,第一个参数为文件名,第二个参数为图像对象。

  1.  
    Mat img = imread("C:\\Users\\aaa\\Pictures\\timg.jpg");
  2.  
    imwrite("rgb.jpg", img);

二、修改图像尺寸

opencv修改图像尺寸支持两种模型:修改为固定size和按比例缩放。

修改为固定size:将img修改为600x400(宽x高),结果存入new_img中

  1.  
    Mat new_img
  2.  
    resize(img, new_img, { 600, 400 });//缩放到固定尺寸

按比例缩放:将img的宽修改为原来的0.2倍,将img的高修改为原来的0.3倍,结果存入new_img2中。需要注意的是缩放比例是正数,且长宽缩放比例需要单独设置。

  1.  
    Mat new_img2;
  2.  
    resize(img, new_img2, {},0.2,0.3);//按比例缩放长宽

三、颜色空间修改

opencv支持多种颜色空间的相互转换,常见的颜色空间有BGR、HSV、LAB、Gray、RGB,总共约支持100多种转换模式(具体可见imgproc.hpp中ColorConversionCodes的枚举类型)。

以下代码实现了将BGR图像转化为GRAY(灰度图)、HSV、Lab、RGB模式。

  1.  
    //颜色空间修改(BGR、HSV、LAB、Gray、RGB)
  2.  
    Mat jray, hsv, lab,rgb;
  3.  
    cvtColor(img, jray, cv::COLOR_BGR2GRAY);
  4.  
    cvtColor(img, hsv, cv::COLOR_BGR2HSV);
  5.  
    cvtColor(img, lab, cv::COLOR_BGR2Lab);
  6.  
    cvtColor(img, rgb, cv::COLOR_BGR2RGB);

四、图像裁剪

使用img(Rect(x,y,w,h))即可在img中的x,y位置截取出一个宽为w长为h的图像。这里需要注意的是Rect的x w不能超过原图的宽[img.cols],y h不能超过原图的高[img.rows])

  1.  
    //图像裁剪 Rect(x,y,w,h)
  2.  
    //(Rect的x w不能超过原图的宽,y h不能超过原图的高)
  3.  
    Rect m_select1 = Rect(0, 100, 300, 217);
  4.  
    Mat ROI1 = img(m_select1);
  5.  
    Rect m_select2 = Rect(300, 100, 320, 217);
  6.  
    Mat ROI2 = img(m_select2);
  7.  
    imshow("img", img);
  8.  
    imshow("ROI1", ROI1);
  9.  
    imshow("ROI2", ROI2);

学新通五、图片粘贴

 opencv实现图像粘贴核心是实验copyTo函数,A.copyTo(B)既将A图粘贴到B中。在实际使用中A图与B的size可能不一样,故需要使用img(Rect(x,y,w,h))裁剪到相同的尺寸。

以下代码实现了将2.4中裁剪的两个小图粘贴到一起

  1.  
    //图片粘贴(实现两个无重叠区域图像的拼接)
  2.  
    //实现两个图像横着拼接
  3.  
    //A.copyTo(B) A与B的大小应该一致
  4.  
    Mat board =Mat::zeros(ROI1.rows, ROI1.cols ROI2.cols, CV_8UC3);
  5.  
    Rect roi_rect1 = Rect(0, 0, ROI1.cols, ROI1.rows);
  6.  
    ROI1.copyTo(board(roi_rect1));
  7.  
    Rect roi_rect2 = Rect(ROI1.cols, 0, ROI2.cols, ROI2.rows);
  8.  
    ROI2.copyTo(board(roi_rect2));
  9.  
    imshow("board", board);

图片拼接效果如下所示 

学新通

六、图像旋转

 opencv图像旋转涉及参数较多,图像旋转需要设置旋转中心点、旋转角度、旋转后空白处填充值、旋转后size。故此定义函数实现图像旋转,以下函数默认旋转中心为图像中心,旋转角度为参数传入,空白处填充模式为边缘拉伸。

  1.  
    /**************************************************************************************************************
  2.  
    Function: RotateImage
  3.  
    Description: 旋转图片
  4.  
    Input: src:需要旋转的图片路径 angle:旋转角度
  5.  
    Return: 旋转后的图片
  6.  
    ***************************************************************************************************************/
  7.  
    cv::Mat RotateImage(cv::Mat src, double angle)
  8.  
    {
  9.  
    cv::Mat dst;
  10.  
    try
  11.  
    {
  12.  
    //float scale = 200.0/ src.rows;//缩放因子
  13.  
    //cv::resize(src, src, cv::Size(), scale, scale, cv::INTER_LINEAR);
  14.  
    //输出图像的尺寸与原图一样
  15.  
    cv::Size dst_sz(src.cols, src.rows);
  16.  
     
  17.  
    //指定旋转中心
  18.  
    cv::Point2f center(static_cast<float>(src.cols / 2.), static_cast<float>(src.rows / 2.));
  19.  
     
  20.  
    //获取旋转矩阵(2x3矩阵)
  21.  
    cv::Mat rot_mat = cv::getRotationMatrix2D(center, angle, 1.0);
  22.  
    //设置选择背景边界颜色
  23.  
    /*cv::Scalar borderColor = Scalar(0, 238, 0);*/
  24.  
    /*cv::warpAffine(src, dst, rot_mat, src.size(), INTER_LINEAR, BORDER_CONSTANT, borderColor);*/
  25.  
    //复制边缘填充
  26.  
    cv::warpAffine(src, dst, rot_mat, dst_sz, cv::INTER_LINEAR, cv::BORDER_REPLICATE);
  27.  
    }
  28.  
    catch (cv::Exception e)
  29.  
    {
  30.  
    }
  31.  
     
  32.  
    return dst;
  33.  
    }
学新通

 调用代码

  1.  
    //图像旋转
  2.  
    //涉及到旋转中心点、旋转角度、旋转后的size、旋转后空白处填充
  3.  
    Mat rotateImg=RotateImage(img, 60);
  4.  
    imshow("rotateImg", rotateImg);

 调用效果

学新通

七、完整代码 

本章节完整代码如下所示

  1.  
    #include <iostream>
  2.  
    #include <opencv2/opencv.hpp>
  3.  
    #include <opencv2/highgui.hpp>
  4.  
    #include <opencv2/imgproc.hpp>
  5.  
     
  6.  
    #include <iostream>
  7.  
    #include <stdlib.h>
  8.  
    #include <stdio.h>
  9.  
    using namespace std;
  10.  
    using namespace cv;
  11.  
    /**************************************************************************************************************
  12.  
    Function: RotateImage
  13.  
    Description: 旋转图片
  14.  
    Input: src:需要旋转的图片路径 angle:旋转角度
  15.  
    Return: 旋转后的图片
  16.  
    ***************************************************************************************************************/
  17.  
    cv::Mat RotateImage(cv::Mat src, double angle)
  18.  
    {
  19.  
    cv::Mat dst;
  20.  
    try
  21.  
    {
  22.  
    //float scale = 200.0/ src.rows;//缩放因子
  23.  
    //cv::resize(src, src, cv::Size(), scale, scale, cv::INTER_LINEAR);
  24.  
    //输出图像的尺寸与原图一样
  25.  
    cv::Size dst_sz(src.cols, src.rows);
  26.  
     
  27.  
    //指定旋转中心
  28.  
    cv::Point2f center(static_cast<float>(src.cols / 2.), static_cast<float>(src.rows / 2.));
  29.  
     
  30.  
    //获取旋转矩阵(2x3矩阵)
  31.  
    cv::Mat rot_mat = cv::getRotationMatrix2D(center, angle, 1.0);
  32.  
    //设置选择背景边界颜色
  33.  
    /*cv::Scalar borderColor = Scalar(0, 238, 0);*/
  34.  
    /*cv::warpAffine(src, dst, rot_mat, src.size(), INTER_LINEAR, BORDER_CONSTANT, borderColor);*/
  35.  
    //复制边缘填充
  36.  
    cv::warpAffine(src, dst, rot_mat, dst_sz, cv::INTER_LINEAR, cv::BORDER_REPLICATE);
  37.  
    }
  38.  
    catch (cv::Exception e)
  39.  
    {
  40.  
    }
  41.  
     
  42.  
    return dst;
  43.  
    }
  44.  
    void main() {
  45.  
    /*彩色图操作
  46.  
    图片的读取,修改,保存。修改尺寸,修改涉及颜色,裁剪,拼接,旋转*/
  47.  
    Mat mat = imread("C:\\Users\\aaa\\Pictures\\timg.jpg");
  48.  
    //Mat的基本属性
  49.  
    // 宽、高;数据类型;通道数
  50.  
    cout << "宽(列):" << mat.cols << ",高(行):" << mat.rows << endl;
  51.  
    cout << "数据类型: " << mat.type() << endl;
  52.  
    cout << "通道数: " << mat.channels() << endl;
  53.  
     
  54.  
     
  55.  
    Mat img = imread("C:\\Users\\aaa\\Pictures\\timg.jpg");
  56.  
    imwrite("rgb.jpg", img);
  57.  
    //resize(img, img, { 600, 400 });//缩放到固定尺寸
  58.  
    resize(img, img, {},0.2,0.2);//按比例缩放长宽
  59.  
     
  60.  
    //颜色空间修改(BGR、HSV、LAB、Gray、RGB)
  61.  
    Mat jray, hsv, lab,rgb;
  62.  
    cvtColor(img, jray, cv::COLOR_BGR2GRAY);
  63.  
    cvtColor(img, hsv, cv::COLOR_BGR2HSV);
  64.  
    cvtColor(img, lab, cv::COLOR_BGR2Lab);
  65.  
    cvtColor(img, rgb, cv::COLOR_BGR2RGB);
  66.  
     
  67.  
    //图像裁剪 Rect(x,y,w,h)
  68.  
    //(Rect的x w不能超过原图的宽,y h不能超过原图的高)
  69.  
    Rect m_select1 = Rect(0, 100, 300, 217);
  70.  
    Mat ROI1 = img(m_select1);
  71.  
    Rect m_select2 = Rect(300, 100, 320, 217);
  72.  
    Mat ROI2 = img(m_select2);
  73.  
    imshow("img", img);
  74.  
    imshow("ROI1", ROI1);
  75.  
    imshow("ROI2", ROI2);
  76.  
     
  77.  
    //图片粘贴(实现两个无重叠区域图像的拼接)
  78.  
    //实现两个图像横着拼接
  79.  
    //A.copyTo(B) A与B的大小应该一致
  80.  
    Mat board =Mat::zeros(ROI1.rows, ROI1.cols ROI2.cols, CV_8UC3);
  81.  
    Rect roi_rect1 = Rect(0, 0, ROI1.cols, ROI1.rows);
  82.  
    ROI1.copyTo(board(roi_rect1));
  83.  
    Rect roi_rect2 = Rect(ROI1.cols, 0, ROI2.cols, ROI2.rows);
  84.  
    ROI2.copyTo(board(roi_rect2));
  85.  
    imshow("board", board);
  86.  
     
  87.  
    //图像旋转
  88.  
    //涉及到旋转中心点、旋转角度、旋转后的size、旋转后空白处填充
  89.  
    Mat rotateImg=RotateImage(img, 60);
  90.  
    imshow("rotateImg", rotateImg);
  91.  
    waitKey(0);
  92.  
    }
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhiahbgi
系列文章
更多 icon
同类精品
更多 icon
继续加载