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