重要API
getStructuringElement获取结构元素(输入图像,输出图像,形态学操作类型,结构元素)
代码展示
#include<opencv2\opencv.hpp>
#include<iostream>
#include<math.h>
#include<opencv2/imgproc/types_c.h>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat src, dst1,dst2,dst3,dst4,dst5;
src = imread("1.jpg");
if (!src.data)
{
printf("无\n");
}
namedWindow("原图", WINDOW_FREERATIO);
imshow("原图", src);
char output1[] = "开操作";//先腐蚀后膨胀,可以去掉小的对象,对象是前景色,背景是黑色
namedWindow(output1, WINDOW_FREERATIO);
Mat kernel1 = getStructuringElement(MORPH_RECT, Size(15, 30), Point(-1, -1));
morphologyEx(src, dst1, CV_MOP_OPEN, kernel1);
imshow(output1, dst1);
char output2[] = "闭操作";//先膨胀后腐蚀,可以填充小的洞,对象是前景色,背景是黑色
namedWindow(output2, WINDOW_FREERATIO);
Mat kernel2 = getStructuringElement(MORPH_RECT, Size(50, 30), Point(-1, -1));
morphologyEx(src, dst2, CV_MOP_CLOSE, kernel2);
imshow(output2, dst2);
char output3[] = "形态学梯度";//膨胀减去腐蚀(包括内部梯度,方向梯度)
namedWindow(output3, WINDOW_FREERATIO);
Mat kernel3 = getStructuringElement(MORPH_RECT, Size(20, 25), Point(-1, -1));
morphologyEx(src, dst3, CV_MOP_GRADIENT, kernel3);
imshow(output3, dst3);
char output4[] = "顶帽";//原图像与开操作之间的差值图像
namedWindow(output4, WINDOW_FREERATIO);
Mat kernel4 = getStructuringElement(MORPH_RECT, Size(50, 30), Point(-1, -1));
morphologyEx(src, dst4, CV_MOP_TOPHAT,kernel4);
imshow(output4, dst4);
char output5[] = "黑帽";//闭操作与源图像的差值图像
namedWindow(output5, WINDOW_FREERATIO);
Mat kernel5 = getStructuringElement(MORPH_RECT, Size(50, 30), Point(-1, -1));
morphologyEx(src, dst5, CV_MOP_BLACKHAT, kernel5);
imshow(output5, dst5);
waitKey(0);
return 0;
}
效果图