开操作-open------CV_MOP_OPEN
先腐蚀,后膨胀
可以去掉小的对象,假设对象是前景色,背景是黑色
相关api
Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11), Point(-1, -1))
morphologyEx(src, dst, CV_MOP_GRADIENT, kernel)
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src, dst;
src = imread("F:/识图/形态学测试.jpg");
if (src.empty()) {
printf("could not image!");
return -1;
}
namedWindow("Input Image", CV_WINDOW_AUTOSIZE);
imshow("Input Image", src);
//获取结构元素
Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11), Point(-1, -1));
morphologyEx(src, dst, CV_MOP_OPEN, kernel);
imshow("outout image", dst);
waitKey(0);
return 0;
}
效果:
闭操作-close—CV_MOP_CLOSE
先膨胀,后腐蚀
可以填充小的洞,假设对象是前景色,背景是黑色
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src, dst;
src = imread("F:/识图/形态学测试.jpg");
if (src.empty()) {
printf("could not image!");
return -1;
}
namedWindow("Input Image", CV_WINDOW_AUTOSIZE);
imshow("Input Image", src);
//获取结构元素
Mat kernel = getStructuringElement(MORPH_RECT, Size(21, 21), Point(-1, -1));
morphologyEx(src, dst, CV_MOP_CLOSE, kernel);
imshow("outout image", dst);
waitKey(0);
return 0;
}
效果:
形态学梯度-Morphological Gradient----CV_MOP_GRADIENT
膨胀后腐蚀
又称为基本梯度(内部梯度和方向梯度)
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src, dst;
src = imread("F:/识图/形态学测试.jpg");
if (src.empty()) {
printf("could not image!");
return -1;
}
namedWindow("Input Image", CV_WINDOW_AUTOSIZE);
imshow("Input Image", src);
//获取结构元素
Mat kernel = getStructuringElement(MORPH_RECT, Size(21, 21), Point(-1, -1));
morphologyEx(src, dst, CV_MOP_GRADIENT, kernel);
imshow("outout image", dst);
waitKey(0);
return 0;
}
效果:
顶帽-top hat—CV_MOP_TOPHAT
顶帽是原图像与开操作之间的差值图像
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src, dst;
src = imread("F:/识图/形态学测试.jpg");
if (src.empty()) {
printf("could not image!");
return -1;
}
namedWindow("Input Image", CV_WINDOW_AUTOSIZE);
imshow("Input Image", src);
//获取结构元素
Mat kernel = getStructuringElement(MORPH_RECT, Size(21, 21), Point(-1, -1));
morphologyEx(src, dst, CV_MOP_TOPHAT, kernel);
imshow("outout image", dst);
waitKey(0);
return 0;
}
效果:
黑帽-black hat------CV_MOP_BLACKHAT
黑帽是闭操作与源图像的差值图像
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src, dst;
src = imread("F:/识图/形态学测试.jpg");
if (src.empty()) {
printf("could not image!");
return -1;
}
namedWindow("Input Image", CV_WINDOW_AUTOSIZE);
imshow("Input Image", src);
//获取结构元素
Mat kernel = getStructuringElement(MORPH_RECT, Size(21, 21), Point(-1, -1));
morphologyEx(src, dst, CV_MOP_BLACKHAT, kernel);
imshow("outout image", dst);
waitKey(0);
return 0;
}
效果: