【知识---OpenCV库中的图像处理的基本操作--cv::resize、cv::cvtColor、cv::split 、 cv::merge、cv::Rect、cv::flip等】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

OpenCV(Open Source Computer Vision Library)是一款开源的计算机视觉和机器学习软件库。它提供了一套全面的工具,用于图像和视频处理、计算机视觉以及机器学习。

图像处理: OpenCV提供了广泛的图像处理功能,涵盖了从基本操作到高级计算机视觉和图像处理任务的广泛范围,包括调整大小、裁剪、旋转、阈值处理、滤波和形态学操作等。这些操作对于操作和增强图像至关重要。

以下是一些常见的图像基本操作函数:


cv::resize

cv::resize函数用于改变图像的尺寸。它的基本语法如下:

cv::resize(src, dst, cv::Size(width, height), interpolation);

其中:

src 是输入图像。

dst 是输出图像。

cv::Size(width, height) 指定目标图像的宽度和高度。

interpolation 是插值方法,例如 cv::INTER_LINEAR(双线性插值)等。

案例

#include <opencv2/opencv.hpp>

int main() {
    // 读取图像
    cv::Mat inputImage = cv::imread("input_image.jpg");

    if (inputImage.empty()) {
        std::cerr << "Error: Unable to load the input image." << std::endl;
        return -1;
    }

    // 调整图像大小
    cv::Mat resizedImage;
    cv::resize(inputImage, resizedImage, cv::Size(640, 480), cv::INTER_LINEAR);

    // 保存调整大小后的图像
    cv::imwrite("resized_image.jpg", resizedImage);

    return 0;
}

cv::cvtColor

cv::cvtColor函数用于在不同的颜色空间之间进行转换。它的基本语法如下:

cv::cvtColor(src, dst, conversionCode);

其中:

src 是输入图像。

dst 是输出图像。

conversionCode 是颜色空间转换的代码,例如 cv::COLOR_BGR2GRAY(BGR到灰度)。

案例

#include <opencv2/opencv.hpp>

int main() {
    // 读取彩色图像
    cv::Mat colorImage = cv::imread("color_image.jpg");

    if (colorImage.empty()) {
        std::cerr << "Error: Unable to load the color image." << std::endl;
        return -1;
    }

    // 转换为灰度图像
    cv::Mat grayscaleImage;
    cv::cvtColor(colorImage, grayscaleImage, cv::COLOR_BGR2GRAY);

    // 保存灰度图像
    cv::imwrite("grayscale_image.jpg", grayscaleImage);

    return 0;
}


cv::split 和 cv::merge

cv::split 和 cv::merge函数用于在多通道图像中分离通道或将单通道图像合并为多通道图像。它的基本语法如下:

// 分离通道
cv::Mat channels[3];
cv::split(colorImage, channels);

// 合并通道
cv::Mat mergedImage;
cv::merge(channels, 3, mergedImage);

在这里,split 将多通道图像分离为各个通道,而 merge 将各通道图像合并为多通道图像。

案例

#include <opencv2/opencv.hpp>

int main() {
    // 读取彩色图像
    cv::Mat colorImage = cv::imread("color_image.jpg");

    if (colorImage.empty()) {
        std::cerr << "Error: Unable to load the color image." << std::endl;
        return -1;
    }

    // 分离通道
    cv::Mat channels[3];
    cv::split(colorImage, channels);

    // 合并通道
    cv::Mat mergedImage;
    cv::merge(channels, 3, mergedImage);

    // 保存分离和合并通道后的图像
    cv::imwrite("split_channels.jpg", mergedImage);

    return 0;
}


cv::Rect 和 ROI

图像裁剪是通过定义感兴趣区域(ROI,Region of Interest)来提取图像的一部分。在OpenCV中,可以使用cv::Rect来指定矩形区域,然后通过在图像上进行索引来提取该区域。

cv::Rect函数用于裁剪图像。它的示例代码如下:

cv::Rect roiRect(100, 50, 300, 200);  // (x, y, width, height)
cv::Mat roi = inputImage(roiRect);

在这个示例中,(100, 50) 是感兴趣区域的左上角坐标,300 是宽度,200 是高度。

然后,通过将roiRect作为索引传递给输入图像,提取了感兴趣区域。

案例

#include <opencv2/opencv.hpp>

int main() {
    // 读取图像
    cv::Mat inputImage = cv::imread("input_image.jpg");

    if (inputImage.empty()) {
        std::cerr << "Error: Unable to load the input image." << std::endl;
        return -1;
    }

    // 定义感兴趣区域 (ROI)
    cv::Rect roiRect(100, 50, 300, 200);  // (x, y, width, height)

    // 提取ROI
    cv::Mat roi = inputImage(roiRect);

    // 保存裁剪后的图像
    cv::imwrite("cropped_image.jpg", roi);

    return 0;
}


cv::getRotationMatrix2D 和 cv::warpAffine

图像旋转是通过计算旋转矩阵,并使用cv::warpAffine函数应用变换来实现的。

cv::getRotationMatrix2D用于计算旋转矩阵,然后cv::warpAffine将该矩阵应用到图像上。

cv::getRotationMatrix2D 和 cv::warpAffine函数用于图像旋转。它的示例代码如下:

cv::Point2f center(inputImage.cols / 2.0, inputImage.rows / 2.0);
double angle = 45.0;
cv::Mat rotationMatrix = cv::getRotationMatrix2D(center, angle, 1.0);
cv::Mat rotatedImage;
cv::warpAffine(inputImage, rotatedImage, rotationMatrix, inputImage.size());

在这个示例中,center 是旋转中心的坐标,angle 是旋转角度,1.0 是缩放因子。

cv::getRotationMatrix2D计算了旋转矩阵,然后cv::warpAffine将该矩阵应用到输入图像上

案例

#include <opencv2/opencv.hpp>

int main() {
    // 读取图像
    cv::Mat inputImage = cv::imread("input_image.jpg");

    if (inputImage.empty()) {
        std::cerr << "Error: Unable to load the input image." << std::endl;
        return -1;
    }

    // 定义旋转中心和角度
    cv::Point2f center(inputImage.cols / 2.0, inputImage.rows / 2.0);
    double angle = 45.0;

    // 计算旋转矩阵
    cv::Mat rotationMatrix = cv::getRotationMatrix2D(center, angle, 1.0);

    // 应用旋转变换
    cv::Mat rotatedImage;
    cv::warpAffine(inputImage, rotatedImage, rotationMatrix, inputImage.size());

    // 保存旋转后的图像
    cv::imwrite("rotated_image.jpg", rotatedImage);

    return 0;
}

cv::flip

图像镜像是通过使用cv::flip函数实现的,该函数可对图像进行水平或垂直翻转。

cv::flip函数用于改变图像镜像。它的代码示例如下:

cv::Mat mirroredImage;
cv::flip(inputImage, mirroredImage, 1);  // 参数为1表示水平翻转

在这个示例中,cv::flip函数将inputImage水平翻转,并将结果保存在mirroredImage中。

参数 1 表示水平翻转,如果是 0 则表示垂直翻转,负值表示同时在水平和垂直方向翻转。

案例

#include <opencv2/opencv.hpp>

int main() {
    // 读取图像
    cv::Mat inputImage = cv::imread("input_image.jpg");

    if (inputImage.empty()) {
        std::cerr << "Error: Unable to load the input image." << std::endl;
        return -1;
    }

    // 水平镜像
    cv::Mat mirroredImage;
    cv::flip(inputImage, mirroredImage, 1);  // 参数为1表示水平翻转

    // 保存镜像后的图像
    cv::imwrite("mirrored_image.jpg", mirroredImage);

    return 0;
}



总结

以上就是OpenCV中的有关于图像的一些基本操作,如有不足之处,还请大家斧正!!!

  • 37
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值