原理
下面的element指的是进行操作的核
- 开操作(opening):
作用:
- 平滑物体的轮廓
- 断开较窄的交界处
- 消除细小的噪声、突出物
- 闭操作(closing):
作用:
- 平滑物体的轮廓
- 弥合较窄的交界处,填补轮廓线的断裂
- 消除细小的孔洞
- 形态学梯度(Morphological Gradient):
作用:提取物体轮廓
- 顶帽(top hat):
.
- 黑帽(black hat):
官方代码
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int morph_elem=0;
int morph_size=0;
int morph_operator=0;
int const max_operator=4;
int const max_elem=2;
int const max_kernel_size=21;
const char* window_name = "Morphlogy Transformation Demo";
void Morphlogy_Opertions(int , void*);
Mat src,dst;
int main(void)
{
src = cv::imread("../res/1.jpg");
if(src.empty())
{
cout << "load image failed" << endl;
return -1;
}
cv::namedWindow(window_name,cv::WINDOW_NORMAL);
//创建Trackbar
cv::createTrackbar("Operator:\n 0:Opening-1:Closing\n2:Gradient-3:Top hat\n4:Black hat",window_name,&morph_operator,max_operator,Morphlogy_Opertions);
cv::createTrackbar("Element:\n 0:Rect-1:Cross-2:Ellipse",window_name,&morph_elem,max_elem,Morphlogy_Opertions);
cv::createTrackbar("Kernel size:\n2n+1",window_name,&morph_size,max_kernel_size,Morphlogy_Opertions);
Morphlogy_Opertions(0,NULL);
waitKey(0);
return 0;
};
void Morphlogy_Opertions(int , void*)
{
int operations= morph_operator+2; //因为第一个是开操作,枚举是2
Mat element = cv::getStructuringElement(morph_elem,Size(2*morph_size+1,2*morph_size+1),Point(morph_size,morph_size));
cv::morphologyEx(src,dst,operations,element);
imshow(window_name,dst);
}
结果:
OpenCV API
此函数可以进行多种形态学操作:腐蚀、膨胀、开、等等
void cv::morphologyEx (
InputArray src,&emsp //原图
OutputArray dst,&emsp //输出图
int op,&emsp // 进行的具体的形态学操作,枚举如下
InputArray kernel,&emsp //核(可以根据cv::getStructuringElement得到)
Point anchor = Point(-1,-1),&emsp //锚点(默认)
int iterations = 1,&emsp //进行此操作的次数(默认)
int borderType = BORDER_CONSTANT,&emsp //边界的处理(默认)
const Scalar & borderValue = morphologyDefaultBorderValue() &emsp //边界的常数值(默认)
)
枚举名 | 数值 | 操作 |
---|---|---|
MORPH_ERODE | 0 | 腐蚀 |
MORPH_DILATE | 1 | 膨胀 |
MORPH_OPEN | 2 | 开 |
MORPH_CLOSE | 3 | 闭 |
MORPH_GRADIENT | 4 | 形态梯度 |
MORPH_TOPHAT | 5 | 顶帽 |
MORPH_BLACKHAT | 6 | 黑帽 |
MORPH_HITMISS | 7 | 击中、不击中 |