【Qt&OpenCV 图像的形态学变换 morpholgyEx】

2023-11-17

腐蚀用于分割(isolate)独立的图像元素,膨胀用于连接(join)相邻的元素。腐蚀、膨胀可用于去噪(低尺寸结构元素的腐蚀操作很容易去掉分散的椒盐噪声点),图像轮廓提取、图像分割、寻找图像中的明显的极大值区域或极小值区域。
高级形态学变换
开运算:先腐蚀,再膨胀,可清除一些小东西(亮的),放大局部低亮度的区域
闭运算:先膨胀,再腐蚀,可清除小黑点
形态学梯度:膨胀图与腐蚀图之差,提取物体边缘
顶帽:原图像-开运算图,突出原图像中比周围亮的区域
黑帽:闭运算图-原图像,突出原图像中比周围暗的区域


前言

越来越多的开发人员选择基于开源的Qt框架与OpenCV来实现界面和算法,其原因不单单是无版权问题,更多是两个社区的发展蓬勃,可用来学习的资料与例程特别丰富。以下是关于利用Qt构建GUI并使用OpenCV中的morphologyEx函数进行图像形态学变换处理。
软件版本:Qt-5.12.0/OpenCV-4.5.3
平台:Windows10/11–64


一、函数介绍

函数原型
cv::morphologyEx( InputArray src, OutputArray dst,
int op, InputArray kernel,
Point anchor = Point(-1,-1), int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue() );

参数解释
src:源图像;
dst:目标图像;
op:操作代号;

0: MORPH_ERODE–腐蚀运算(Erode operation)
1: MORPH_DILATE–膨胀运算(Dilate operation)
2: MORPH_OPEN–开运算(Opening operation)
3: MORPH_CLOSE–闭运算(Closing operation)
4: MORPH_GRADIENT–形态学梯度(Morphological gradient)
5: MORPH_TOPHAT–“顶帽”(Top hat)
6: MORPH_BLACKHAT–“黑帽”(Black hat)
7: MORPH_HITMISS

kernel:核(用于膨胀操作的结构元素),可使用getStructuringElement()方法创建
anchor:锚点坐标,为负代表核的中心坐标
iterations:迭代次数
borderType:像素外推方法,具有默认值 BORDER_CONSTANT
borderValue:边界为常数时的边界值,有默认值morphologyDefaultBorderValue()

二、演示

1、GUI

在这里插入图片描述
如上图创建Operator/Type的QComboBox控件和Morph的功能按钮QPushButton,对当前窗口的图像进行形态学变换,并输出状态信息。

2、代码实现

morphBtn的clicked()槽函数的实现代码:

void MainWindow::on_morphBtn_clicked()
{
    std::size_t numView = ui->tabWidget->currentIndex() % 3;
    if (dispMat[numView]->empty())
    {
        outputInfo(2, tr("Please make sure the Mat exist!"));
        return;
    }

    int morphElem = ui->morphElemCombo->currentIndex();
    int morphOperator = ui->morphOperatorCombo->currentIndex();
    int morphSize = ui->morphSpin->value();

    cv::Mat element = cv::getStructuringElement(morphElem, \
                                                cv::Size(2 * morphSize + 1, \
                                                         2 * morphSize + 1), \
                                                cv::Point(morphSize, morphSize));
    tmpMat->zeros(dispMat[numView]->rows, \
                  dispMat[numView]->cols, \
                  dispMat[numView]->type());
    cv::morphologyEx(*dispMat[numView], *tmpMat, morphOperator, element);

    if (ui->morphChkBox->isChecked())
    {
        *dispMat[numView] = tmpMat->clone();
        cvtMatPixmap(dispMat, dispPixmap, numView);
    }
    else
    {
        if (tmpMat->channels() == 3)
        {
            QImage tmpImage = QImage(tmpMat->data, tmpMat->cols,tmpMat->rows, \
                         static_cast<int>(tmpMat->step), \
                         QImage::Format_RGB888);
            dispPixmap[numView]->setPixmap(QPixmap::fromImage(tmpImage.rgbSwapped()));
        }
        else
        {
            QImage tmpImage = QImage(tmpMat->data, tmpMat->cols,tmpMat->rows, \
                         static_cast<int>(tmpMat->step), \
                         QImage::Format_Grayscale8);
            dispPixmap[numView]->setPixmap(QPixmap::fromImage(tmpImage.rgbSwapped()));
        }

    }
    outputInfo(1, tr("Morphology done."));

}

总结

以上是关于利用Qt进行GUI构建并使用OpenCV中的morphologyEx函数进行图像形态学变换处理。
参考:
链接:linkhttps://blog.csdn.net/richard_yuu/article/details/128011754

其中疑问或错误,欢迎联系交流,微信:electrical_program

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Qt&OpenCV 图像的形态学变换 morpholgyEx】 的相关文章

  • opencv中矩阵的超快中值(与matlab一样快)

    我正在 openCV 中编写一些代码 想要找到一个非常大的矩阵数组 单通道灰度 浮点数 的中值 我尝试了几种方法 例如对数组进行排序 使用 std sort 和选择中间条目 但与 matlab 中的中值函数相比 它非常慢 准确地说 在 ma
  • OpenCV:视频结束后如何重新启动?

    我正在播放视频文件 但播放完毕后如何再次播放 Javier 如果您想一遍又一遍地重新启动视频 也称为循环播放 可以通过在帧数达到时使用 if 语句来实现cap get cv2 cv CV CAP PROP FRAME COUNT 然后重置帧
  • 如何在Qt中设置编译器?

    我对 Qt 完全陌生 我下载了离线版本 Qt 5 3 2 for Windows 64 bit VS 2013 OpenGL 573 MB 我无法编译我的项目 I have Qt Creator 3 2 1 开源 基于Qt 5 3 2 MS
  • QT 应用程序运行时错误?

    我已经在 Windows 7 的 Qt5 1 上开发了一个应用程序 现在我想分发它 由于我使用了 MINGW 编译器 因此无法静态构建它 我使用dependency walker找出所有dll并打包 当我在未安装 QT 开发环境的计算机上运
  • 通过对 XmlHttpRequest (REST) 的响应在 QML 中显示图像

    我需要从 REST API 调用中获取 jpeg 图像 我使用 XMLHttpRequest 因为请求需要身份验证标头 即我不能只创建一个图像并将源设置为带有 user passwd url 的 URL 我认为我可以通过将 REST 数据设
  • 对齐坐标系

    Let s say I have 2 coordinate systems as it is shown in image attached 如何对齐这个坐标系 我知道我需要将第二个坐标系围绕 X 平移 180 度 然后将其平移到第一个坐标
  • 提高 pytesseract 从图像中正确识别文本的能力

    我正在尝试使用读取验证码pytesseract模块 大多数时候它都能提供准确的文本 但并非总是如此 这是读取图像 操作图像以及从图像中提取文本的代码 import cv2 import numpy as np import pytesser
  • qt项目如何设置安装路径

    我正在寻找与 qmake configure prefix 等效的内容 基本上 我想覆盖默认的安装 部署目录 这是如何用命令行 qmake 指定的 我还使用 QtCreator 构建了很多 gui 项目 并且我想知道如何在 QtCreato
  • 使用Python的工业视觉相机[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • OpenCV 错误:使用 COLOR_BGR2GRAY 函数时断言失败

    我在使用 opencv 时遇到了一个奇怪的问题 我在 jupyter 笔记本中工作时没有任何问题 但在尝试运行此 Sublime 时却出现问题 错误是 OpenCV错误 cvtColor中断言失败 深度 CV 8U 深度 CV 16U 深度
  • 从 QML 实例化 C++ 对象会产生巨大的内存使用开销

    实例化一个QObjectC 堆中的派生类为每个对象提供了大约 160 个字节 通过注册相同的对象qmlRegisterType 用于从 QML 创建并通过以下方式动态创建对象createObject 每个对象给我 2000 多个字节 这是完
  • 无法在 Windows 7 机器中使用 OpenCV 2.4.3、Python 2.7 打开“.mp4”视频文件

    我目前正在进行一个涉及读取 mp4 视频文件的项目 我遇到的问题是它在Windows 7机器上使用Python 2 7 32位 OpenCV 2 4 3 cv2 pyd 代码片段如下 try video cv2 VideoCapture v
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • 如何在 C++ 运行时更改 QML 对象的属性?

    我想在运行时更改 QML 对象的文本 我尝试如下 但文本仍然为空 这是后端类 class BackEnd public QObject Q OBJECT Q PROPERTY QString userFieldText READ userF
  • 如何在按下托盘图标菜单操作时执行功能?

    int main int argc char argv QApplication oApp argc argv QAction action1 QMenu menu QSystemTrayIcon TrayIcon QIcon favico
  • opencv 2.3.* 读取不工作

    我无法让 imread 工作 与这个人有同样的问题 OpenCV imwrite 2 2 在 Windows 7 上导致异常 并显示消息 OpenCV 错误 未指定错误 无法找到指定扩展名的编写器 https stackoverflow c
  • 如何在 OpenCV 中从 YUV 文件读取帧?

    如何在 OpenCV 中从 YUV 文件读取帧 我编写了一个非常简单的 python 代码来从二进制文件读取 YUV NV21 流 import cv2 import numpy as np class VideoCaptureYUV de
  • QDesktopServices::openUrl 在资源管理器中选择指定文件

    在大多数编码程序中 您可以右键单击该项目 然后单击 在资源管理器中显示 它会在资源管理器中显示选定项目的文件 在 Qt 中使用 QDesktopServices 如何做到这一点 或在 QT 中执行此操作的任何方式 您可以使用此方法在 Win
  • (如何)我可以抑制未找到包配置文件的警告吗?

    我正在尝试创建一个CMakeLists txt尝试查找的文件Qt5 如果失败 则尝试回退到Qt4安装 该脚本到目前为止有效 但如果出现以下情况我总会收到警告Qt5未安装 注意FindQt5 cmake是由提供Qt5并且仅当以下情况时才可用Q
  • 检查图像中是否有太薄的区域

    我正在尝试验证雕刻机的黑白图像 更多的是剪贴画图像 不是照片 我需要考虑的主要事情之一是区域的大小 或线条的宽度 因为机器无法处理太细的线条 所以我需要找到比给定阈值更细的区域 以此图为例 竖琴的琴弦可能太细而无法雕刻 我正在阅读有关 Ma

随机推荐

  • 【JavaSe】高级特性篇(三) Java高级特性注解

    JavaSe 高级特性篇 三 Java高级特性注解 1 注解 Annotation 概述 1 1 定义 定义 注解 Annotation 也叫元数据 一种代码级别的说明 它是JDK1 5及以后版本引入的一个特性 与类 接口 枚举是在同一个层
  • Redis-五种数据结构

    1 五种数据结构图解如下 1 1 String数据结构 命令 get set del incr decrget set del incr decr 联想java map
  • Matplotlib绘制漂亮的饼状图

    python绘图系列文章目录 往期python绘图合集 python绘制简单的折线图 python读取excel中数据并绘制多子图多组图在一张画布上 python绘制带误差棒的柱状图 python绘制多子图并单独显示 python读取exc
  • 【满分】【华为OD机试真题2023 JAVA&JS】计算网络信号

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 计算网络信号 知识点广搜数组 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 网络信号经过传递会逐层衰减 且遇到阻隔物无法直接穿透 在此情况下需要计算某个位置的网
  • MISC方向MeowMeowMeow解题方法

    下载好附件后 通过好多工具都没有找到flag 突发奇想通过010工具打开MeowMeow png 发现了一堆乱码 当划到最下面的时候 发现了那些乱码有一定的规律 这个时候向上找 找到最开始出现规律的位置 会发现与题目给的flag格式CatC
  • 1001 害死人不偿命的(3n+1)猜想 (15 分)

    1001 害死人不偿命的 3n 1 猜想 15 分 卡拉兹 Callatz 猜想 对任何一个正整数 n 如果它是偶数 那么把它砍掉一半 如果它是奇数 那么把 3n 1 砍掉一半 这样一直反复砍下去 最后一定在某一步得到 n 1 卡拉兹在 1
  • 函数模板全特化与偏特化

    模板为什么要特化 因为编译器认为 对于特定的类型 如果你能对某一功能更好的实现 那么就该听你的 模板分为类模板与函数模板 特化分为全特化与偏特化 全特化就是限定死模板实现的具体类型 偏特化就是如果这个模板有多个类型 那么只限定其中的一部分
  • 7 个非常实用的 Vue.js 库

    编辑整理 杨小爱 我们在开发项目的时候 为了提升开发效率 会经常使用一些实用的开发库 而Vue js 又是前端领域中很受欢迎的框架之一 因此 就有很多开发者开发了各种实用的库 在这里 我整理了 7 个觉得好用的 Vue js 库 希望这些库
  • Acwing 795. 前缀和

    include
  • Go测试学习

    前言 textcolor Green 前言 前言 这个专栏就专门来记录一下寒假参加的第五期字节跳动训练营 从这个专栏里面可以迅速获得Go的知识 Go测试学习 03 测试 3 1 单元测试 3 1 1 单元测试 规则 3 1 2 单元测试 例
  • Linux安装Tomcat详细教程

    一 安装前提 Tomcat依赖于Java环境 所以在运行Tomcat之前 我们需要提前配置好Java环境变量 可以参考以往教程 Linux安装Java详细教程 注 Tomcat和Java使用版本最好保持一致 如果用的JDK1 8 那么最好就
  • 三维模型3DTile格式轻量化压缩模型变形浅析

    三维模型3DTile格式轻量化压缩模型变形浅析 在对三维模型进行轻量化压缩处理的过程中 常常会出现模型变形的现象 这种变形现象多数源于模型压缩过程中信息丢失或误差累积等因素 以下将对此现象进行详细分析 首先 我们需要了解三维模型轻量化压缩的
  • 有限自动机总结

    有限自动机A用来识别字符串 它由5部分组成 1 alphabet 字符集 2 states 状态集合 3 init 初始状态 4 trans s ch 状态转移函数 5 end 可接受state 集合 A str true的意思是 A可以接
  • unity中mathf.Lerp的运用

    在unity3d中经常用线性插值函数Lerp 来在两者之间插值 两者之间可以是两个材质之间 两个向量之间 两个浮点数之间 两个颜色之间 其函数原型如下 1 Material Lerp 插值 function Lerp start Mater
  • 03目标检测-传统方法与深度学习算法对比

    一 目标学习的检测方法变迁及对比 目标检测 是当前计算机视觉和机器学习领域的研究热点 从Viola Jones Detector DPM等冷兵器时代的智慧到当今RCNN YOLO等深度学习土壤孕育下的GPU暴力美学 整个目标检测的发展可谓是
  • 在SpringBoot中使用百度AI,实现通用图片识别(身份证识别也通用)

    现在网上有好多第三方使用的文章 但是没几个是可以使用的 本片文章可以放心使用哦 3 1 先去百度ai官网注册一个账号 2 选择我们需要使用的功能 3 因为我们这个是测试使用 他每天会有很多次免费使用的次数 因此完全够用 4 去领取我们需要的
  • 结巴分词jieba添加自定义词典

    结巴分词添加自定义词典 有时候很有必要 比如下面这段话 test text 我们的健康码也是绿色的 这凭什么就限制我们的就医 如果使用默认的分词 那么 健康码 这个词会分成 健康 和 码 这里可以使用词典方式 添加自定义词典 新建一个txt
  • mysql写存储过程插入数据

    DROP PROCEDURE if exists insert emps test 下面就开始创建存储过程插入数据 DELIMITER 不加这个会报错 坑了我两个小时CREATE PROCEDURE insert emps test IN
  • C#分段读取超大文本文件

    一 概述 通过C 分段读取和操作超大内存的文本文件 保证操作大于3GB的txt时内存不会爆 包括获取txt文件总行数 按行分段等 二 操作流程 1 读取文件总行数 获取txt的总行数 public int GetTunnelInfos st
  • 【Qt&OpenCV 图像的形态学变换 morpholgyEx】

    腐蚀用于分割 isolate 独立的图像元素 膨胀用于连接 join 相邻的元素 腐蚀 膨胀可用于去噪 低尺寸结构元素的腐蚀操作很容易去掉分散的椒盐噪声点 图像轮廓提取 图像分割 寻找图像中的明显的极大值区域或极小值区域 高级形态学变换 开