目录
文章目录
前言
一、加载、显示、保存图像
示例代码:
二、调整图像大小
示例代码:
三、裁剪图像
示例代码:
四、反转图像
示例代码:
五、调整亮度和对比度
示例代码:
六、代码整合
七、其他常见操作
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
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
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
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
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
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个单位。alpha
和beta
值控制了图像的亮度和对比度。alpha
值为1时,不对图像进行调整;alpha
值大于1时,图像变亮;alpha
值小于1时,图像变暗。
#include
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
#include
#include
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(i, j); // 获取像素值
// 对像素进行处理
}
}
auto end_time = std::chrono::steady_clock::now(); // 结束计时
auto elapsed_time = std::chrono::duration_cast(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的拷贝,包括深拷贝和浅拷贝。