OpenCV提供了一个综合的形态转换工具 morphologyEx() ,集成了腐蚀运算、膨胀运算、开运算、闭运算、梯度运算、顶帽运算、黑帽运算。
- void 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 | 形态运算的类型 ● MORPH_ERODE 腐蚀 ● MORPH_DILATE 膨胀 ● MORPH_OPEN 开运算 ● MORPH_CLOSE 闭运算 ● MORPH_GRADIENT 梯度运算 ● MORPH_TOPHAT 顶帽运算 ● MORPH_BLACKHAT 黑帽匀速 ● MORPH_HITMISS 命中/未命中 |
| kernel | 结构元素(可以使用 getStructuringElement 创建) |
| anchor | 结构元素的锚点位置(默认值(-1,-1)表示锚位于元素中心) |
| iterations | 形态运算的迭代次数 |
| borderType | 图像边框扩展模式(可查阅BorderTypes,但不支持BORDER_WRAP) |
| borderValue | 恒定边界的边界值 |
- #include "widget.h"
- #include "ui_widget.h"
-
- #include <opencv2/core/core.hpp>
- #include <opencv2/highgui/highgui.hpp>
- #include <opencv2/imgproc/imgproc.hpp>
-
- using namespace cv;
-
- Widget::Widget(QWidget *parent)
- : QWidget(parent)
- , ui(new Ui::Widget)
- {
- ui->setupUi(this);
-
- //载入图像
- Mat src = imread("c:/opencv/star.jpg");
- //显示
- imshow("src",src);
-
- //自定义核
- Mat element = getStructuringElement(MORPH_ELLIPSE,Size(5,5));
-
- //腐蚀运算
- Mat dst_erode;
- morphologyEx(src,dst_erode,MORPH_ERODE,element);
- imshow("dst_erode",dst_erode);
-
- //膨胀运算
- Mat dst_dilate;
- morphologyEx(src,dst_dilate,MORPH_DILATE,element);
- imshow("dst_dilate",dst_dilate);
-
- //开运算
- Mat dst_open;
- morphologyEx(src,dst_open,MORPH_OPEN,element);
- imshow("dst_open",dst_open);
-
- //闭运算
- Mat dst_close;
- morphologyEx(src,dst_close,MORPH_CLOSE,element);
- imshow("dst_close",dst_close);
-
- //梯度运算
- Mat dst_gradient;
- morphologyEx(src,dst_gradient,MORPH_GRADIENT,element);
- imshow("dst_gradient",dst_gradient);
-
- //顶帽运算
- Mat dst_top;
- morphologyEx(src,dst_top,MORPH_TOPHAT,element);
- imshow("dst_top",dst_top);
-
- //黑帽运算
- Mat dst_black;
- morphologyEx(src,dst_black,MORPH_BLACKHAT,element);
- imshow("dst_black",dst_black);
-
-
-
- }
-
- Widget::~Widget()
- {
- delete ui;
- }
