open cv形态学操作
利用之前学习的的sturcturingelement形态学操作结构体进行对接
基本操作
●膨胀和腐蚀(替换中心像素-锚点)
形态学操作
●开操作- open
●先腐蚀后膨胀dst=open(src,element)=dilate(erode(src,element));
●可以去掉小的对象 ,并且不会把不必要的形状缩小
去掉小的对象 ,并且不会把不必要的形状缩小
●闭操作- close
●先膨胀后腐蚀(bin2) dst=close(src,element) = erode(dilate(src,element))
●可以填充小的洞( flllhole )
可以填充小的洞( flllhole )
●形态学梯度- Morphological Gradient
●膨胀减去腐蚀
dst =morphgrad(src,elment)=dilate(src,element)-erode(src,element)
●又称为基本梯度 (其它还包括,内部梯度(原图)、方向梯度(X,Y方向))
利用色差进行颜色区分以勾勒轮廓
●顶帽-top hat
●顶帽:是原图像与开操作之间的差值图像 有黑点的原图减去去掉黑点的开操作图形 得到小黑点
原图减去处理过的开操作 获得小白点 减去大白点
●黑帽
黑帽是闭操作图像与源图像的差值图像
闭操作减去原图 必操作之后 大白块里的黑点变成白色随后再减去原图像只剩下白点
相关API
形态学操作
●cv::morphologyEx
(src, dest, CV_MOP_BLACKHAT, kernel);
形态学操作类型
1. CV_ MOP_ OPEN
2. CV_ MOP_ CLOSE
3. CV_ MOP_ GRADIENT
4. CV_MOP_ TOPHAT
5. CV_MOP_ BLACKHAT
Mat SE结构元素
int teration迭代次数,默认是1
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <iostream>
#include <math.h>//morphologyEx形态学操作需要math库文件
using namespace cv;
using namespace std;
Mat dst;
Mat src;
int Osize = 3;
int Msize= 21;
void MORPHOLOGY(int, void*);
//没有int和void* 滑块不起作用
int main()
{
// src = imread("D:/实验台/机器视觉/测试图片/机器人正面.jpg");
src = imread("D:/实验台/机器视觉/测试图片/灰色衬衫.jpg");//形态学梯度用图
if (!src.data)
{
cout << "无法导入" << endl;
return -1;
}
namedWindow("原图",CV_WINDOW_AUTOSIZE);
imshow("原图",src);
namedWindow("开操作",CV_WINDOW_AUTOSIZE);
createTrackbar("卷积核大小","开操作",&Osize,Msize, MORPHOLOGY);
MORPHOLOGY(0,0);
waitKey(0);
}
void MORPHOLOGY(int, void*)
{
cvtColor(src, dst, CV_BGR2GRAY);
threshold(dst, dst, 200, 255, THRESH_BINARY);//阈值化操作 配合灰度化可实现图像二值化(黑白)
//(阀门)threshold(原图像, 处理后图像, 阈值, 最大值, 阀值类型(二进制));
//THRESH_BINARY 当前点值大于阈值时,取Maxval,也就是第四个参数,下面再不说明,否则设置为0
//THRESH_BINARY_INV 当前点值大于阈值时,设置为0,否则设置为Maxval
//THRESH_TRUNC 当前点值大于阈值时,设置为阈值,否则不改变
//THRESH_TOZERO 当前点值大于阈值时,不改变,否则设置为0
//THRESH_TOZERO_INV 当前点值大于阈值时,设置为0,否则不改变
int s = Osize *2+1;
Mat SE = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
//morphology(原图像,处理后图像,形态学操作类型,结构元素);
//morphologyEx(src, dst, CV_MOP_OPEN, SE);//开操作 可以去掉小的白色对象,保证大的白色部分不变。假设对象是白色,背景是黑色。
//morphologyEx(dst,dst,CV_MOP_CLOSE,SE);//闭操作 以填充小的黑色洞,大片的黑色不变,假设对象是白色,背景是黑色,去掉污渍
morphologyEx(dst,dst,CV_MOP_GRADIENT,SE);//梯度操作 利用色差进行颜色区分勾勒轮廓
//morphologyEx(src,dst,CV_MOP_TOPHAT,SE);//顶帽操作 原图减去处理过的开操作 获得小白点 减去大白点
//morphologyEx(dst,dst,CV_MOP_BLACKHAT,SE);//黑帽操作 闭操作减去原图 必操作之后 大白块里的黑点变成白色随后再减去原图像只剩下白点
imshow("开操作", dst);
return;
}