概述
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;
}