OpenCV中图像操作的基础介绍

news/2024/10/30 11:30:09/

文章目录

目录

文章目录

前言

一、加载、显示、保存图像

示例代码:

二、调整图像大小

示例代码:

三、裁剪图像

示例代码:

四、反转图像

示例代码:

五、调整亮度和对比度

示例代码:

六、代码整合

七、其他常见操作


前言

        OpenCV是一款开源计算机视觉库,它可以用于处理图像和视频数据。它提供了各种各样的函数和算法,可以用于图像处理、图像分析、目标检测等方面。本篇博客将介绍OpenCV中图像操作的基础知识。


一、加载、显示、保存图像

        使用OpenCV读取图像的过程很简单。您可以使用函数cv::imread()来读取图像文件。该函数需要两个参数:图像文件路径和读取标志。读取标志指定图像应如何读取。常用的读取标志包括:

  • cv::IMREAD_COLOR:读取带有Alpha通道的彩色图像。如果图像不包含Alpha通道,则将其转换为三通道BGR图像。
  • cv::IMREAD_GRAYSCALE:以灰度模式读取图像。将图像转换为单通道灰度图像。
  • cv::IMREAD_UNCHANGED:读取原始图像,包括Alpha通道。

        在OpenCV中显示图像非常简单。您可以使用函数cv::imshow()来显示图像。该函数需要两个参数:窗口名称和要显示的图像。以下是显示图像的示例代码:

如果您想将处理过的图像保存到磁盘上,OpenCV也提供了方便的函数。您可以使用函数cv::imwrite()来将图像写入文件。该函数需要两个参数:保存图像的路径和要保存的图像。

示例代码:

#include <opencv2/opencv.hpp>
using namespace cv;int main()
{// 加载图像Mat image = imread("image.jpg", IMREAD_COLOR);// 检查图像是否正确加载
if(image.empty())
{std::cout << "无法加载图像" << std::endl;return -1;
}// 显示图像
imshow("Image", image);
waitKey(0);// 保存图像
imwrite("output.jpg", image);return 0;

二、调整图像大小

        在OpenCV中,您可以使用函数`cv::resize()`来调整图像的大小。该函数需要三个参数:要调整大小的图像、目标大小以及插值方法。

示例代码:


## 调整图像大小#include <opencv2/opencv.hpp>
using namespace cv;int main()
{// 加载图像Mat image = imread("image.jpg", IMREAD_COLOR);// 检查图像是否正确加载if(image.empty()){std::cout << "无法加载图像" << std::endl;return -1;}// 显示原始图像imshow("Original", image);// 调整图像大小Mat resized;resize(image, resized, Size(400, 300), 0, 0, INTER_LINEAR);// 显示调整大小后的图像imshow("Resized", resized);waitKey(0);return 0;
}

三、裁剪图像

        在OpenCV中,您可以使用函数cv::Rect()来创建矩形区域,然后使用函数cv::Mat::operator()cv::Mat::row()cv::Mat::col()来选择图像的子集。

示例代码:

#include <opencv2/opencv.hpp>
using namespace cv;int main()
{// 加载图像Mat image = imread("image.jpg", IMREAD_COLOR);// 检查图像是否正确加载if(image.empty()){std::cout << "无法加载图像" << std::endl;return -1;}// 显示原始图像imshow("Original", image);// 裁剪图像Rect roi(50, 50, 200, 200);Mat cropped = image(roi);// 显示裁剪后的图像imshow("Cropped", cropped);waitKey(0);return 0;
}

四、反转图像

        在OpenCV中,您可以使用函数cv::flip()来翻转图像。该函数需要两个参数:要翻转的图像和翻转类型(0表示绕x轴翻转,1表示绕y轴翻转,-1表示绕两个轴同时翻转)。

示例代码:

#include <opencv2/opencv.hpp>
using namespace cv;int main()
{// 加载图像Mat image = imread("image.jpg", IMREAD_COLOR);// 检查图像是否正确加载if(image.empty()){std::cout << "无法加载图像" << std::endl;return -1;}// 显示原始图像imshow("Original", image);// 沿x轴翻转图像Mat flipped_x;flip(image, flipped_x, 0);// 显示沿x轴翻转后的图像imshow("Flipped X", flipped_x);// 沿y轴翻转图像Mat flipped_y;flip(image, flipped_y, 1);// 显示沿y轴翻转后的图像imshow("Flipped Y", flipped_y);// 沿两个轴同时翻转图像Mat flipped_xy;flip(image, flipped_xy, -1);// 显示沿两个轴同时翻转后的图像imshow("Flipped XY", flipped_xy);waitKey(0);return 0;
}

        在上述代码中,我们分别沿x轴、y轴和两个轴同时翻转了原始图像,并显示了翻转后的图像。

五、调整亮度和对比度

        在OpenCV中,您可以使用函数cv::convertTo()来调整图像的亮度和对比度。该函数需要三个参数:要调整的图像、输出图像、以及一个alpha值和一个beta值。

示例代码:

#include <opencv2/opencv.hpp>
using namespace cv;int main()
{// 加载图像Mat image = imread("image.jpg", IMREAD_COLOR);// 检查图像是否正确加载if(image.empty()){std::cout << "无法加载图像" << std::endl;return -1;}// 显示原始图像imshow("Original", image);// 调整图像亮度和对比度Mat adjusted;image.convertTo(adjusted, -1, 1.5, 30);// 显示调整后的图像imshow("Adjusted", adjusted);waitKey(0);return 0;
}

        在上述代码中,我们将原始图像的亮度增加了1.5倍,并将对比度增加了30个单位。alphabeta值控制了图像的亮度和对比度。alpha值为1时,不对图像进行调整;alpha值大于1时,图像变亮;alpha值小于1时,图像变暗。

六、代码整合

#include <opencv2/opencv.hpp>
using namespace cv;int main()
{// 加载图像Mat image = imread("image.jpg", IMREAD_COLOR);// 检查图像是否正确加载if(image.empty()){std::cout << "无法加载图像" << std::endl;return -1;}// 显示原始图像imshow("Original", image);// 缩放图像Mat resized;resize(image, resized, Size(640, 480));// 显示缩放后的图像imshow("Resized", resized);// 翻转图像Mat flipped_x;flip(image, flipped_x, 0);Mat flipped_y;flip(image, flipped_y, 1);Mat flipped_xy;flip(image, flipped_xy, -1);// 显示翻转后的图像imshow("Flipped X", flipped_x);imshow("Flipped Y", flipped_y);imshow("Flipped XY", flipped_xy);// 调整图像亮度和对比度Mat adjusted;image.convertTo(adjusted, -1, 1.5, 30);// 显示调整后的图像imshow("Adjusted", adjusted);waitKey(0);return 0;
}

七、其他常见操作

        下面是将读取指定路径下的图像、判断图像文件是否正确读取、输出基本信息、判断图像类型、遍历图像、计时算法以及cv::Mat的拷贝的介绍整合在一起的示例代码:

#include <iostream>
#include <chrono>
#include <opencv2/opencv.hpp>using namespace cv;int main()
{// 读取图像Mat image = imread("path/to/image.jpg", IMREAD_COLOR);// 判断图像是否正确读取if (image.empty()){std::cout << "无法加载图像" << std::endl;return -1;}// 输出基本信息std::cout << "图像尺寸:" << image.size() << std::endl;std::cout << "通道数:" << image.channels() << std::endl;std::cout << "像素格式:" << image.type() << std::endl;// 判断图像类型if (image.type() == CV_8UC3){std::cout << "图像类型:RGB图像" << std::endl;}else if (image.type() == CV_8UC1){std::cout << "图像类型:灰度图像" << std::endl;}// 遍历图像auto start_time = std::chrono::steady_clock::now(); // 开始计时for (int i = 0; i < image.rows; i++){for (int j = 0; j < image.cols; j++){Vec3b pixel = image.at<Vec3b>(i, j); // 获取像素值// 对像素进行处理}}auto end_time = std::chrono::steady_clock::now(); // 结束计时auto elapsed_time = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time);std::cout << "遍历图像耗时:" << elapsed_time.count() << " ms" << std::endl;// cv::Mat的拷贝Mat image_copy = image.clone(); // 深拷贝Mat image_ref = image; // 浅拷贝return 0;
}

        在上述示例代码中,我们首先读取指定路径下的图像,并判断图像是否正确读取。然后输出了图像的基本信息,并根据图像类型进行了判断。接着,我们使用双重循环遍历了图像,并计时了遍历算法的耗时。最后,我们演示了cv::Mat的拷贝,包括深拷贝和浅拷贝。

 


http://www.ppmy.cn/news/42142.html

相关文章

Redis数据迁移过程,使用jedis客户端,需要注意区分string和byte命令转换字符编码不一致的问题,使用不当会导致丢数据

1.了解String与byte之间存在的字符编码映射规则&#xff08;java为例&#xff09; string与byte来回转换&#xff0c;需要指定一样字符编码规则 详细原因请参考&#xff1a;关于Java中bytes到String的转换-阿里云开发者社区 简单来说 &#xff08;1&#xff09;string和by…

Cont. DB Project ----- MySQL Python Project

Function achieve &#xff08;Cont.&#xff09; Item Search 添加一个新函数search_item&#xff0c;用于实现商品搜索的功能。参数&#xff1a;keyword (为了模糊查询) # search items by keywords def search_item(keyword):cursor, db connect_database()sql f"SE…

《花雕学AI》06:抢先体验ChatGPT的九个国内镜像站之试用与综合评测

最近ChatGPT持续大火&#xff0c;大家们是不是在网上看到各种和ChatGPT有趣聊天的截图&#xff0c;奈何自己实力不够&#xff0c;被网络拒之门外&#xff0c;只能眼馋别人的东西。看别人在体验&#xff0c;看别人玩&#xff0c;肯定不如自己玩一把舒服的啊。 上一期&#xff0…

FIFO的工作原理及其设计

1.简介 FIFO( First Input First Output)简单说就是指先进先出。FIFO存储器是一个先入先出的双口缓冲器&#xff0c;即第一个进入其内的数据第一个被移出&#xff0c;其中一个口是存储器的输入口&#xff0c;另一个口是存储器的输出口。 对于单片FIFO来说&#xff0c;主要有两种…

JDBC03-批处理、连接池、DBUtils、事物、DAO通用方法

1. 封装 JDBCUtils 【关闭、得到连接】 1.1 说明 1.2 代码实现 工具类 JDBCUtils package com.hspedu.jdbc.utils;import java.io.FileInputStream; import java.io.IOException; import java.sql.*; import java.util.Properties; /** * 这是一个工具类&#xff0c;完成 my…

重装系统下载网址

[置顶]无论会不会安装系统&#xff0c;都一定会需要&#xff0c;觉得内容不错欢迎一键三连哦 稳定 | 方便 | 好用 1、MSDN 用过最简单好用&#xff0c;下载不限速&#xff0c;支持迅雷、IDM多种下载方式 https://www.xitongku.com 2、Windows系统下载仓储站 为小白重装系统提供…

yum源配置

一、互联网yum源&#xff08;centos7为例&#xff09;: cd /etc/yum.repos.d/ && rm -f *.repo;wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo…

docker常用步骤

1、进入一个已经在运行的容器 $ sudo docker ps $ sudo docker exec -it 775c7c9ee1e1 /bin/bash 2、启停容器 假如容器名称是nginx 停止容器nginx docker stop nginx 启动容器nginx docker start nginx 3、复制内容到容器中 docker cp /Downloads/xxx.zip 1faca6a70742:/opt…