OpenCV学习 day5 形态学操作
图像的形态学操作——基于形状的一系列的图像处理操作合集
形态学的四个基本操作:膨胀、腐蚀、开、闭
值得注意的是:腐蚀和膨胀是对白色部分(高亮部分)而言的,不是黑色部分
1. 膨胀dilate
A-原图
B-核
B覆盖下的A中最大像素值代替锚点像素,像素值整体变大
结构型元素(核)定义:
Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));
shape-可以是矩形,也可以是椭圆等 通过MORPH_*查看
ksize-是结构型元素大小
anchor-默认是(-1,-1)中心
如下图所示的结构元素是菱形(1构成的菱形区域)
膨胀操作:
void dilate( InputArray src, OutputArray dst, InputArray kernel, Point anchor = Point(-1,-1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue = morphologyDefaultBorderValue() );
kernel-就是定义的结构型元素
iterations-迭代运行几次
2. 腐蚀erode
B覆盖下的A中最小像素值代替锚点像素,像素值整体变小
void erode( InputArray src, OutputArray dst, InputArray kernel, Point anchor = Point(-1,-1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue = morphologyDefaultBorderValue() );
demo:
#include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv; Mat src, d_dst, r_dst, dst, bt_dst; char OUTPUT[] = "dilate image"; int element_size = 3; int max_size = 15; void CallBack_Demo(int, void*); int main(int argc, char** argv) { src = imread("D:/learning/image/5.jpg", WINDOW_AUTOSIZE); if (src.empty()) { printf("can not found image...\n"); return -1; } namedWindow(OUTPUT); //设置拖动滑块控制size大小 createTrackbar("Element size:", OUTPUT, &element_size, max_size, CallBack_Demo); CallBack_Demo(0, 0); waitKey(0); return 0; } // void CallBack_Demo(int, void*) { int s = element_size * 2 + 1; //定义结构型元素 Mat structure_element = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1)); //dilate(src, dst, structure_element, Point(-1, -1), 1); //膨胀 erode(src, dst, structure_element, Point(-1, -1), 1); //腐蚀 imshow(OUTPUT, dst); return; }
其中createTrackbar函数创建一个滑块,用来控制膨胀腐蚀操作中的参数,效果如下图所示:
形态学操作
开 闭 形态学梯度 顶帽 黑帽
主要针对二值图像
morphologyEx函数
morphologyEx( InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor = Point(-1,-1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue = morphologyDefaultBorderValue() )
int op- 形态学操作类型
3. 开open
先腐蚀后膨胀
背景为黑 可以去掉小的前景
4. 闭close
先膨胀后腐蚀
可以填充前景中小的黑洞
开闭操作通过morphologyEx函数实现:
void morphologyEx( InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor = Point(-1,-1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue = morphologyDefaultBorderValue() );
op-是操作的指令 前缀为MORPH_*
kernel-通过getStructuringElement指定,size越大,处理的范围越大
开:
Mat kernel = getStructuringElement(MORPH_RECT, Size(15, 15), Point(-1, -1)); morphologyEx(src, dst, MORPH_OPEN, kernel, Point(-1, -1)); imshow("input image", src); imshow("output image", dst);
闭:
Mat kernel = getStructuringElement(MORPH_RECT, Size(15, 15), Point(-1, -1)); morphologyEx(src, dst, MORPH_CLOSE, kernel, Point(-1, -1)); imshow("input image", src); imshow("output image", dst);
4.形态学梯度 morphological gradient
又称基本梯度
膨胀减去腐蚀
op为MORPH_GRADIENT
5. 顶帽 top hat
原图像与开操作的差值
去掉大的前景
OP为MORPH_TOPHAT
6. 黑帽 black hat
闭操作图像与原图的差值
op为MORPH_TOPHAT
应用