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


文章目录

  • 前言
  • 一、函数介绍
  • 二、演示
  • 1、GUI
  • 2、代码实现
  • 总结



前言

越来越多的开发人员选择基于开源的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

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


如上图创建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函数进行图像形态学变换处理。
参考:
链接:link