c++图像形态学操作
1、开运算
-
开运算:先腐蚀后膨胀。
对左图进行闭运算,先进行腐蚀,腐蚀就是将最小值像素赋值给锚点,即将黑色像素值赋值给锚点,除去了白色点,后进行膨胀,将最大值即白色点赋值给锚点。
图像开运算api:
morphologyEx(src, dst, MORPH_OPEN, struct, Point);
struct: 结构元,
kernel:卷积核大小,
Point: 锚点的位置。
2、闭运算
- 闭运算:
先进行膨胀后进行腐蚀。
左图经过闭运算得到右图,首先进行膨胀操作,即将最大值白色像素赋值给锚点,可以除掉较大的黑色像素值,后进行腐蚀操作,即最小值黑色像素赋值给锚点。
图像的闭运算api:
morphologyEx(src, dst, MORPH_CLOSE, struct, Point);
3、顶帽
- 顶帽:
顶帽 = 原图像 - 开运算
api:
morphologyEx(src, dst, MORPH_TOPHAT, struct, Point);
4、黑帽
- 黑帽 = 闭运算 - 原图
api:
morphologyEx(src, dst, MORPH_BALCKHAT, Point);
5、图像基本梯度
- 基本梯度 = 膨胀 - 腐蚀
api:
morphologyEx(src, dst, struct, Point);
6、代码
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
Mat img,dst;
int element = 3;
int max_size = 10;
void CallbackFunc(int, void*);
int main(int argc, char** argv)
{
img = imread("G:/testpic/img.png");
if (!img.data)
{
printf("cannot load the image");
return -1;
}
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", img);
//拉伸条
namedWindow("output", WINDOW_AUTOSIZE);
createTrackbar("num:", "output", &element, max_size, CallbackFunc);
CallbackFunc(0,0);
waitKey(0);
return 0;
}
void CallbackFunc(int, void*)
{
int k = element * 2 + 1;
//结构元
Mat structElement = getStructuringElement(MORPH_RECT, Size(k, k), Point(-1,-1));
//开运算 : 先腐蚀后膨胀
morphologyEx(img, dst, MORPH_OPEN, structElement, Point(-1,-1));
//闭运算:先膨胀后腐蚀
morphologyEx(img, dst, MORPH_CLOSE, structElement, Point(-1,-1));
//基本梯度 = 膨胀 - 腐蚀
morphologyEx(img, dst, MORPH_GRADIENT, structElement, Point(-1,-1));
//顶帽 = 原图 - 开运算
morphologyEx(img, dst, MORPH_TOPHAT, structELement, Point(-1,-1));
//黑帽 = 闭运算 - 原图
morphologyEx(img, dst, MORPH_BLACKHAT, structElement, Point(-1,-1));
imshow("output", dst);
return;
}
原图:
开运算:
闭运算:
基本梯度:
顶帽:
黑帽: