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

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

腐蚀用于分割(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函数进行图像形态学变换处理。

目录
相关文章
|
2月前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
104 7
基于qt的opencv实时图像处理框架FastCvLearn实战
|
2月前
|
文字识别 计算机视觉 开发者
基于QT的OCR和opencv融合框架FastOCRLearn实战
本文介绍了在Qt环境下结合OpenCV库构建OCR识别系统的实战方法,通过FastOCRLearn项目,读者可以学习Tesseract OCR的编译配置和在Windows平台下的实践步骤,文章提供了技术资源链接,帮助开发者理解并实现OCR技术。
127 9
基于QT的OCR和opencv融合框架FastOCRLearn实战
|
1月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
322 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
2月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
49 4
|
2月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
2月前
|
计算机视觉
基于QT的opencv插件框架qtCvFrameLearn实战
这篇文章详细介绍了如何基于Qt框架开发一个名为qtCvFrameLearn的OpenCV插件,包括项目配置、插件加载、Qt与OpenCV图像转换,以及通过各个插件学习OpenCV函数的使用,如仿射变换、卡通效果、腐蚀、旋转和锐化等。
44 10
|
2月前
|
机器学习/深度学习 Java 计算机视觉
opencv4.5.5+qt5.15.2+vtk9.1+mingw81_64编译记录
本文记录了使用mingw81_64编译OpenCV 4.5.5、Qt 5.15.2、VTK 9.1的详细过程,包括编译结果截图、编译步骤、遇到的问题及其解决方案,以及相关参考链接。文中还提到了如何编译boost源码为静态库,并提供了测试代码示例。
opencv4.5.5+qt5.15.2+vtk9.1+mingw81_64编译记录
WK
|
3月前
|
编解码 计算机视觉 Python
如何在OpenCV中进行图像转换
在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
WK
108 1
|
3月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
|
5月前
|
算法 计算机视觉
【Qt&OpenCV 图像的感兴趣区域ROI】
【Qt&OpenCV 图像的感兴趣区域ROI】
165 1