第十节、形态学操作(二)
开操作- open
- 先腐蚀后膨胀
- 可以去掉小的对象,假设对象是前景色,背景是黑色
闭操作-close
- 先膨胀后腐蚀(bin2)
- 可以填充小的洞(fill hole),假设对象是前景色,背景是黑色
形态学梯度- Morphological Gradient
- 膨胀减去腐蚀
- 又称为基本梯度(其它还包括-内部梯度、方向梯度)
顶帽 – top hat
- 顶帽 是原图像与开操作之间的差值图像
黑帽
- 黑帽是闭操作图像与源图像的差值图像
相关API
morphologyEx(src, dest, CV_MOP_BLACKHAT, kernel);
- Mat src – 输入图像
- Mat dest – 输出结果
- 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;
int main(int argc, char** argv) {
Mat src, dst;
src = imread("7.png");
if (!src.data) {
printf("could not load image...\n");
return -1;
}
char INPUT_WIN[] = "input image";
char OUTPUT_WIN[] = "result image";
namedWindow(INPUT_WIN, CV_WINDOW_AUTOSIZE);
imshow(INPUT_WIN, src);
Mat gray_src;
cvtColor(src, gray_src, CV_BGR2GRAY);//转换为灰度图像
imshow("gray image", gray_src);
Mat binImg;
adaptiveThreshold(~gray_src, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);//转换为二值图像
imshow("binary image", binImg);
// 水平结构元素
Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 16, 1), Point(-1, -1));
// 垂直结构元素
Mat vline = getStructuringElement(MORPH_RECT, Size(1, src.rows / 16), Point(-1, -1));
// 矩形结构
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
Mat temp;
erode(binImg, temp, kernel);//腐蚀
dilate(temp, dst, kernel);//膨胀
// morphologyEx(binImg, dst, CV_MOP_OPEN, vline);//开操作
bitwise_not(dst, dst);//像素取反操作
//blur(dst, dst, Size(3, 3), Point(-1, -1));//均值滤波
imshow("Final Result", dst);
waitKey(0);
return 0;
}