opencv学习十二----形态学操作----腐蚀,膨胀,开,闭 以及形态学梯度
形态学操作(morphology operators)
- 图像形态学操作- 基于形状的一系列图像处理操作的合集,主要是基于集合论基础上的形态学数学
- 形态学有四个基本操作:腐蚀,膨胀,开,闭
- 膨胀与腐蚀是图像处理中最常用的形态学操作手段
膨胀
- 和卷积操作类似,假设有图像A和数据结构B ,结构元素B在A上移动,其中B定义其中心为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,其中B作为结构体可以是任意形状
腐蚀
- 以最小值替换锚点像素值
开操作-open
- 先腐蚀后膨胀
- 开操作是一般使对象的轮廓变得光滑,断开狭窄的间断和消除细的突出物。
- 可以去除噪声,当然也可以提取水平线等等,第十三篇line就使用开操作
闭操作-close
- 先膨胀后腐蚀
- 假设对象是前景色,背景是黑色,可以填充小的洞
形态学梯度(morphological gradient)
- 膨胀减去腐蚀
- 又称为基本梯度(其他还包括 内部梯度,方向梯度)
顶帽-top hat
- 原图像与开操作之间的差值
黑帽
- 闭操作图像与原图之间的差值
API
getStructuringElement(shape,Size,Point(-1,-1))
- 用于获取结构元素
- 基本定义
Mat kernel=getStructuringElement(int shape ,Size ksize ,Point anchor//Point(-1,-1));
- 参数说明
shape//可选择MORPH_RECT(矩形) , MORPH_CROSS(十字) , MORPH_ELLIPSE(椭圆)
dilate(src,dst,kernel)
- 膨胀
erode(src,dst,kernel)
- 腐蚀
createTrackbar()
- 创建一个滑动控件
- 基本定义
createTrackbar(const string& trackbarname, const string& winname,
int* value, int count,
TrackbarCallback onChange = 0, void* userdata = 0);
参数解释
trackbarname:控件名称
winname:显示控件的窗口名称
*value:&初始化阈值
count:最大刻度值
TrackbarCallback:回调函数
比如
int value=127;
int count=255;
createTrackbar("thresh:","out_win",&value,count,callback_demo);
代码演示
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
Mat src, dst;
int element_size = 2;
int max_size = 21;
void Callback_demo(int, void*);
int main(int argc, char** argv)
{
src = imread("D:/vcprojects/kaicaozuo.png");
if (src.empty())
{
printf("could not load image...\n");
return -1;
}
namedWindow("OUTPUT_WIN", WINDOW_AUTOSIZE);
createTrackbar("element size:", "OUTPUT_WIN", &element_size, max_size, Callback_demo);
Callback_demo(0, 0);
waitKey(0);
return 0;
}
void Callback_demo(int, void *)
{
int s = 2 * element_size + 1;
Mat structure=getStructuringElement(MORPH_RECT, Size(s,s), Point(-1, -1));
dilate(src, dst, structure, Point(-1, -1), 1);
erode(dst, dst, structure);
imshow("OUTPUT_WIN", dst);
return;
}
结果