【OpenCV】形态学操作
- 开操作- open
- 闭操作- close
- 形态学梯度- Morphological Gradient
- 顶帽 – top hat
- 黑帽 – black hat
开操作- open
先腐蚀后膨胀
可以去掉小的对象,假设对象是前景色,背景是黑色
闭操作-close
先膨胀后腐蚀(bin2)
可以填充小的洞(fill hole),假设对象是前景色,背景是黑色
形态学梯度- Morphological Gradient
膨胀减去腐蚀
又称为基本梯度(其它还包括-内部梯度、方向梯度)
顶帽 – top hat
顶帽 是原图像与开操作之间的差值图像
黑帽
黑帽是闭操作图像与源图像的差值图像
相关API
morphologyEx(src, dst, CV_MOP_BLACKHAT, kernel);
Mat src
– 输入图像Mat dst
– 输出结果
- int OPT – CV_MOP_OPEN/ CV_MOP_CLOSE/ CV_MOP_GRADIENT / CV_MOP_TOPHAT/ CV_MOP_BLACKHAT
形态学操作类型
-Mat kernel
结构元素
-int Iteration
迭代次数,默认是1
代码实现
#include<opencv2/opencv.hpp>
#include<iostream>
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.empty() ){
printf("can not load the image...\n");
return -1;
}
namedWindow("input", CV_WINDOW_AUTOSIZE);
imshow("input", src);
char output_title[] = "OPEN";
namedWindow(output_title, CV_WINDOW_AUTOSIZE);
Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11), Point(-1, -1));//开运算
morphologyEx(src, dst1, CV_MOP_OPEN, kernel);
imshow(output_title, dst1);
imwrite("open.jpg", dst1);
morphologyEx(src, dst2, CV_MOP_CLOSE, kernel);//闭运算
imshow("CLOSE", dst2);
imwrite("CLOSE.jpg", dst2);
morphologyEx(src, dst3, CV_MOP_GRADIENT, kernel);//形态学梯度- Morphological Gradient
imshow("GRADIENT", dst3);
imwrite("GRADIENT.jpg", dst3);
morphologyEx(src, dst4, CV_MOP_TOPHAT, kernel);//顶帽
imshow("TOPHAT", dst4);
imwrite("TOPHAT.jpg", dst4);
morphologyEx(src, dst5, CV_MOP_BLACKHAT, kernel);//黑帽
imshow("BLACKHAT", dst5);
imwrite("BLACKHAT.jpg", dst5);
waitKey(0);
return 0;
}
实验结果
原图
开运算open
闭运算close
形态学梯度CV_MOP_GRADIENT
顶帽运算CV_MOP_TOPHAT
黑帽运算CV_MOP_BLACKHAT