当前位置: 首页 > article >正文

Qt之OpenCv 灰度处理、均值滤波、边缘检测学习

本章来学习一下opencv常见的操作,首先看下我们的Qt制作好的界面:

源码在后面。

灰度化:

均值滤波:

 

边缘检测:

 

那么对应以下的主要函数源码以及学习:

首先是加载图像的:

  1. QString imagePath = QFileDialog::getOpenFileName(this,tr("打开文件"),"C:/Users/ALIENTEK/Desktop","(所有图像(*.jpg *.png *.bmp))");

    • 使用QFileDialog类的静态函数getOpenFileName弹出一个文件选择对话框。
    • this作为第一个参数,通常表示当前窗口对象,用于指定对话框的父窗口。
    • tr("打开文件")是对话框的标题,用于显示给用户。
    • "C:/Users/ALIENTEK/Desktop"是对话框打开时的初始目录。
    • "所有图像(*.jpg *.png *.bmp))"是文件过滤器,用于限制用户只能选择特定类型的图像文件。
    • 该函数返回用户选择的文件路径,存储在imagePath变量中。
  2. if(imagePath.isEmpty()){ return; }

    • 检查imagePath是否为空,如果用户没有选择文件或者取消了文件选择对话框,imagePath将为空字符串。在这种情况下,函数直接返回,不进行后续操作。
  3. srcImage = imread(imagePath.toStdString());

    • 使用 OpenCV 的imread函数读取用户选择的图像文件,并将图像数据存储在srcImage(类型为cv::Mat)中。
    • imagePath.toStdString()将 Qt 的 QString 类型的文件路径转换为标准 C++ 字符串,以便 OpenCV 函数能够使用。
  4. cvtColor(srcImage,srcImage,CV_BGR2RGB);

    • 使用 OpenCV 的cvtColor函数将加载的图像从 BGR 颜色空间转换为 RGB 颜色空间。这是因为 Qt 的QImage通常使用 RGB 格式,而 OpenCV 默认使用 BGR 格式。
  5. QImage disaplayImg = QImage(srcImage.data,srcImage.cols,srcImage.rows,srcImage.cols * srcImage.channels(),QImage::Format_RGB888);

    • 创建一个QImage对象disaplayImg,从 OpenCV 的Mat对象srcImage中获取图像数据。
    • srcImage.data是图像的像素数据指针。
    • srcImage.colssrcImage.rows分别是图像的宽度和高度。
    • srcImage.cols * srcImage.channels()是每行的字节数,其中channels()表示图像的通道数。
    • QImage::Format_RGB888指定图像的格式为 RGB 8-8-8,即每个像素由三个 8 位的颜色通道组成。
  6. QImage disimage = imageCenter(disaplayImg,ui->opencv_show1);

    • 调用一个名为imageCenter的函数,传入刚刚创建的QImage对象disaplayImg和一个界面组件指针ui->opencv_show1。这个函数可能是用于对图像进行某种处理或调整图像在界面上的显示位置。
  7. ui->opencv_show1->setPixmap(QPixmap::fromImage(disimage));

    • 将处理后的QImage对象disimage转换为QPixmap对象,然后设置到一个界面组件(可能是一个标签或图像显示区域)ui->opencv_show1上,以显示图像。

 

灰度处理:

  1. Mat grayImage;

    • 定义一个 OpenCV 的Mat对象grayImage,用于存储灰度图像。
  2. cvtColor(srcImage,grayImage,COLOR_BGR2GRAY);

    • 使用 OpenCV 的cvtColor函数将原始的彩色图像srcImage转换为灰度图像,并存储在grayImage中。这里的COLOR_BGR2GRAY表示从 BGR(蓝绿红)颜色空间转换为灰度空间。
  3. cvtColor(grayImage,grayImage,COLOR_GRAY2RGB);

    • 再次使用cvtColor函数将灰度图像grayImage转换回 RGB 颜色空间。这一步可能是为了使灰度图像能够以彩色格式显示在使用 RGB 格式的界面组件上。虽然图像实际上是灰度的,但以 RGB 格式显示可以让灰度值在三个通道上重复,从而在某些显示场景下更方便地展示灰度图像。
  4. QImage disaplayImg = QImage(grayImage.data,grayImage.cols,grayImage.rows,grayImage.cols * grayImage.channels(),QImage::Format_RGB888);

    • 创建一个QImage对象disaplayImg,从转换后的grayImage中获取图像数据。参数的含义与前面类似,这里的QImage::Format_RGB888表示图像格式为 RGB 8-8-8,即使图像实际上是灰度的,也以这种格式表示。
  5. QImage disimage = imageCenter(disaplayImg,ui->opencv_show2);

    • 调用一个名为imageCenter的函数,传入刚刚创建的QImage对象disaplayImg和一个界面组件指针ui->opencv_show2。这个函数可能是用于对图像进行某种处理或调整图像在界面上的显示位置。
  6. ui->opencv_show2->setPixmap(QPixmap::fromImage(disimage));

    • 将处理后的QImage对象disimage转换为QPixmap对象,然后设置到一个界面组件(可能是一个标签或图像显示区域)ui->opencv_show2上,以显示灰度图像。

 

均值滤波:

  1. Mat blurImage;

    • 定义一个 OpenCV 的Mat对象blurImage,用于存储经过均值滤波处理后的图像。
  2. blur(srcImage, blurImage, Size(4, 4));

    • 使用 OpenCV 的blur函数对原始图像srcImage进行均值滤波操作,并将结果存储在blurImage中。
    • Size(4, 4)指定了均值滤波的内核大小为 4x4。内核越大,滤波效果越平滑,但也可能导致图像细节丢失更多。
  3. QImage disaplayImg = QImage(blurImage.data, blurImage.cols, blurImage.rows, blurImage.cols * blurImage.channels(), QImage::Format_RGB888);

    • 创建一个QImage对象disaplayImg,从滤波后的图像blurImage中获取图像数据。参数的含义与前面类似,这里的QImage::Format_RGB888表示图像格式为 RGB 8-8-8。
  4. QImage disimage = imageCenter(disaplayImg, ui->opencv_show2);

    • 调用一个名为imageCenter的函数,传入刚刚创建的QImage对象disaplayImg和一个界面组件指针ui->opencv_show2。这个函数可能是用于对图像进行某种处理或调整图像在界面上的显示位置。
  5. ui->opencv_show2->setPixmap(QPixmap::fromImage(disimage));

    • 将处理后的QImage对象disimage转换为QPixmap对象,然后设置到一个界面组件(可能是一个标签或图像显示区域)ui->opencv_show2上,以显示经过均值滤波处理后的图像。

边缘检测:有三种方法

  1. if(srcImage.empty()){ return; }

    • 检查原始图像srcImage是否为空。如果为空,说明没有加载有效的图像,函数直接返回,不进行后续处理。
  2. Mat cannyImage, grayImage;

    • 定义两个 OpenCV 的Mat对象cannyImagegrayImage,分别用于存储边缘检测后的图像和灰度图像。
  3. cvtColor(srcImage, grayImage, COLOR_BGR2GRAY);

    • 将原始的彩色图像srcImage转换为灰度图像grayImage,因为许多边缘检测算法通常在灰度图像上效果更好。

1. Canny 边缘检测方法

  • Canny(grayImage, cannyImage, 200, 1);
    • 使用 OpenCV 的Canny函数进行边缘检测。
    • 第一个参数是输入的灰度图像grayImage
    • 第二个参数是输出的边缘检测图像cannyImage
    • 后面两个参数分别是低阈值和高阈值。低于低阈值的像素点被认为不是边缘,高于高阈值的像素点被认为是边缘,介于两者之间的像素点如果与高于高阈值的像素点相连则被认为是边缘。调整这两个阈值可以控制检测到的边缘的数量和强度。

2. Laplacian 边缘检测方法

  • Laplacian(grayImage, cannyImage, grayImage.depth());
    • 使用 OpenCV 的Laplacian函数进行边缘检测。
    • 第一个参数是输入的灰度图像grayImage
    • 第二个参数是输出的边缘检测图像cannyImage
    • 第三个参数是输出图像的深度,这里使用与输入图像相同的深度。Laplacian 边缘检测是通过计算图像的二阶导数来检测边缘的,通常会产生较暗的结果,因为它对图像中的细节和噪声比较敏感。

3. 基于 Sobel 算子的边缘检测及加权融合方法

  • Mat sobel_x, sobel_y;
    • 定义两个Mat对象sobel_xsobel_y,分别用于存储水平方向和垂直方向的 Sobel 边缘检测结果。
  • Sobel(grayImage, sobel_x, CV_8U, 1.2, 0);Sobel(grayImage, sobel_y, CV_8U, 1.2, 0);
    • 使用 OpenCV 的Sobel函数进行边缘检测。
    • 第一个参数是输入的灰度图像grayImage
    • 第二个参数分别是输出的水平和垂直方向的边缘检测图像sobel_xsobel_y
    • 第三个参数CV_8U表示输出图像的数据类型为 8 位无符号整数。
    • 第四个参数和第五个参数分别表示在 x 和 y 方向上的导数阶数以及用于计算导数的内核大小。这里导数阶数为 1.2,第五个参数为 0,表示只计算 x 方向(第一个调用)或 y 方向(第二个调用)的边缘。增大导数阶数可能会使边缘更明显,但也可能引入更多噪声。改变内核大小也会影响边缘检测的结果,较大的内核可能会使边缘更平滑,但也可能丢失一些细节。
  • addWeighted(sobel_x, 0.7, sobel_y, 0.3, 2, cannyImage);
    • 使用 OpenCV 的addWeighted函数对水平和垂直方向的 Sobel 边缘检测结果进行加权融合。
    • 第一个参数是水平方向的边缘检测图像sobel_x
    • 第二个参数是sobel_x的权重系数 0.7,表示在融合结果中sobel_x的贡献占比。
    • 第三个参数是垂直方向的边缘检测图像sobel_y
    • 第四个参数是sobel_y的权重系数 0.3,表示在融合结果中sobel_y的贡献占比。
    • 第五个参数是一个标量值 2,表示加到加权和上的亮度调整值。
    • 第六个参数是输出的融合结果图像cannyImage
  1. cvtColor(cannyImage, cannyImage, COLOR_GRAY2BGR);

    • 如果前面的边缘检测结果是灰度图像,将其转换回 BGR 颜色空间,以便以彩色格式显示在使用 RGB 格式的界面组件上。虽然边缘检测结果通常是灰度的,但以彩色格式显示可以在某些情况下更方便地观察边缘。
  2. QImage disaplayImg = QImage(cannyImage.data, cannyImage.cols, cannyImage.rows, cannyImage.cols * cannyImage.channels(), QImage::Format_RGB888);

    • 创建一个QImage对象disaplayImg,从边缘检测后的图像cannyImage中获取图像数据。参数的含义与前面类似,这里的QImage::Format_RGB888表示图像格式为 RGB 8-8-8。
  3. QImage disimage = imageCenter(disaplayImg, ui->opencv_show2);

    • 调用一个名为imageCenter的函数,传入刚刚创建的QImage对象disaplayImg和一个界面组件指针ui->opencv_show2。这个函数可能是用于对图像进行某种处理或调整图像在界面上的显示位置。
  4. ui->opencv_show2->setPixmap(QPixmap::fromImage(disimage));

    • 将处理后的QImage对象disimage转换为QPixmap对象,然后设置到一个界面组件(可能是一个标签或图像显示区域)ui->opencv_show2上,以显示边缘检测后的图像。

 

源码链接:https://download.csdn.net/download/weixin_57695658/89738890


http://www.kler.cn/news/304888.html

相关文章:

  • 端口大全说明,HTTP,TCP,UDP常见端口对照表
  • Go语言现代web开发07 map字典
  • Eclipse 悬浮提示:提高编程效率的利器
  • Android NDK工具
  • BFS迷宫最小路径问题
  • 【人工智能】OpenAI发布GPT-o1模型:推理能力的革命性突破,这将再次刷新编程领域的格局!
  • 二叉树(上)
  • 定时中断键盘灯闪烁
  • P2865 [USACO06NOV] Roadblocks G
  • C#使用TCP-S7协议读写西门子PLC(五)-测试程序
  • 【玩转贪心算法专题】452. 用最少数量的箭引爆气球是【中等】
  • Java中重写和重载
  • c++ 编辑器 和 编译器 的详细解释
  • Ubuntu20-xrdp与Windows-mstsc远程桌面连接
  • C语言-整数和浮点数在内存中的存储-详解-上
  • JavaEE:文件内容操作(一)
  • docker--刚开始学不知道如何操作拉取,或拉取失败(cmd)
  • EmguCV学习笔记 C# 11.5 目标检测
  • 期货量化现在是要比股票量化更适合高频交易,程序化交易
  • 电脑桌面数据误删如何恢复?提供一份实用指南
  • spark sql详解
  • MVC 控制器
  • Qt-QLCDNumber显示类控件(26)
  • 如何简化机器人模型,加速仿真计算与可视化
  • 基于less和scss 循环生成css
  • Java中的高级I/O操作:NIO和AIO的比较
  • 大数据-129 - Flink CEP 详解 Complex Event Processing - 复杂事件处理
  • 哪个虚拟机软件在 Mac 上更好用,Mac 虚拟机会影响性能吗?
  • 计算机网络30——Linux-gdb调试命令makefile
  • [Linux#48][网络] 令牌环网 | IPv4 | socket 套接字 | TCP | UDP | 网络字节序列