OpenCV 系列 --- 形态学操作(膨胀、腐蚀)
来源:互联网 发布:淘宝怎么申请ifashion 编辑:程序博客网 时间:2024/05/19 16:04
形态学操作是基于形状的一系列图像处理操作,基本的运算包括:腐蚀、膨胀、开、闭等。在进行其他算法研发时,我基本只用膨胀与腐蚀操作,因此本文只介绍这两种操作,其他的可以相似地进行。
关键点
- 操作是对图像中的高亮区域进行的,比如膨胀,就是将图像中的高亮区域扩大。
- 它们可以达到的目的
- 去除噪声
- 分离出独立的元素或者连接独立的元素
- 可以求图像梯度或者图像中的小洞
测试用图
为了更加清晰地显示出操作前后的差距,采用如下图所示的二值图
一定要注意,形态学操作不光可以用在二值图,也可以用在灰度图,甚至可以用在彩色图。
基本原理
- 膨胀
膨胀就是利用一个核(叫做结构元素)与图像进行卷积。随着核的移动,每次都取核覆盖区域的最大像素值,因此最终完成的效果是将高亮区域扩大。 - 腐蚀
同样地,腐蚀也是卷积操作。随着核的移动,每次都取核覆盖区域的最小像素值,因此最终完成的效果是将高亮区域缩小。
代码示例
以下代码是OpenCV文档中给出的一段代码,比较能说明问题,我加了一些注释
#include "opencv2/imgproc/imgproc.hpp"#include "opencv2/highgui/highgui.hpp"#include "highgui.h"#include <stdlib.h>#include <stdio.h>using namespace cv;/// 全局变量Mat src, erosion_dst, dilation_dst;int erosion_elem = 0;int erosion_size = 0;int dilation_elem = 0;int dilation_size = 0;int const max_elem = 2;int const max_kernel_size = 21;/** Function Headers */void Erosion( int, void* );//腐蚀操作void Dilation( int, void* );//膨胀操作/** @function main */int main(){ /// Load an image src = imread("coins.png"); if( !src.data ) { return -1; } /// Create windows namedWindow( "Erosion Demo", CV_WINDOW_AUTOSIZE ); namedWindow( "Dilation Demo", CV_WINDOW_AUTOSIZE );//Element:\n 0: Rect \n 1: Cross \n 2: Ellipse /// 腐蚀操作滚动条 createTrackbar( "Element:", "Erosion Demo",&erosion_elem, max_elem,Erosion ); createTrackbar( "Kernel", "Erosion Demo",&erosion_size, max_kernel_size,Erosion ); /// 膨胀操作滚动条 createTrackbar( "Element:", "Dilation Demo",&dilation_elem, max_elem,Dilation ); createTrackbar( "Kernel", "Dilation Demo",&dilation_size, max_kernel_size,Dilation ); // 开始 Erosion( 0, 0 ); Dilation( 0, 0 ); waitKey(0); return 0;}/** @function Erosion */void Erosion( int, void* ){ int erosion_type; if( erosion_elem == 0 ) { erosion_type = MORPH_RECT; //矩形结构元素 } else if( erosion_elem == 1 ) { erosion_type = MORPH_CROSS; //十字结构元素 } else if( erosion_elem == 2) { erosion_type = MORPH_ELLIPSE;//椭圆结构元素 }//生成核(结构元素) Mat element = getStructuringElement( erosion_type,Size( 2*erosion_size + 1, 2*erosion_size+1 ), Point( erosion_size, erosion_size ) ); //腐蚀操作 erode( src, erosion_dst, element ); imshow( "Erosion Demo", erosion_dst );}/** @function Dilation */void Dilation( int, void* ){ int dilation_type; if( dilation_elem == 0 ) { dilation_type = MORPH_RECT; //矩形结构元素 } else if( dilation_elem == 1 ) . { dilation_type = MORPH_CROSS; //十字结构元素 } else if( dilation_elem == 2) { dilation_type = MORPH_ELLIPSE; //椭圆结构元素 }//生成核(结构元素) Mat element = getStructuringElement( dilation_type,Size(2*dilation_size + 1, 2*dilation_size+1 ), Point( dilation_size, dilation_size ) ); //腐蚀操作 dilate( src, dilation_dst, element ); imshow( "Dilation Demo", dilation_dst );}
结果
- 采用7*7矩形结构元素
左图是腐蚀、右图为膨胀。可以看出,腐蚀缩小了白色(高亮)区域,而膨胀扩大了白色区域。 - 采用十字结构元素,大小为7,结果如下
左图是腐蚀、右图为膨胀。可以看出,腐蚀缩小了白色(高亮)区域,而膨胀扩大了白色区域。 - 采用椭圆结构元素,大小为15,结果如下
可以看出,当白色区域为圆形时,采用椭圆形的结构元素生成的结果较为规则,圆形结构保持较为完整。
0 0
- OpenCV 系列 --- 形态学操作(膨胀、腐蚀)
- OpenCV形态学操作 腐蚀 膨胀 开闭
- OpenCV形态学操作 腐蚀 膨胀 开闭
- opencv形态学-腐蚀和膨胀
- opencv----形态学运算:腐蚀、膨胀
- OpenCV学习笔记-形态学操作-腐蚀膨胀-开闭运算
- OpenCV图像处理形态学操作腐蚀Erode与膨胀Dilate
- opencv图像的形态学操作:腐蚀与膨胀
- 腐蚀,膨胀,opencv的形态学处理
- opencv 3.0 形态学运算 膨胀与腐蚀
- OpenCV杂记06---形态学、膨胀和腐蚀
- python opencv形态学变换:腐蚀与膨胀
- 形态学-腐蚀、膨胀、开操作、闭操作
- 形态学中的腐蚀 膨胀 开关操作
- 笔记:形态学操作-----腐蚀Erode && 膨胀 Dilate
- 2014.2.21 形态学开操作 膨胀腐蚀
- 图像形态学操作—腐蚀膨胀深入
- 图像形态学操作—腐蚀膨胀深入
- 动态加载未安装的apk文件里面的类
- Android4.2使用TextClock出现"HH:00"的问题的解决方案
- Crime and Punishment
- 怎样在知网检索SCI/EI期刊
- Docker网络优化方案,你认为哪种将引爆未来?
- OpenCV 系列 --- 形态学操作(膨胀、腐蚀)
- 进程之间的通信
- QT5 creator 调试器未配置
- 树莓派学习笔记—— 源代码方式安装opencv
- Thinkpad T550 安装Ubuntu16.04 配置 Shadowsocks 安装fcitx五笔98词库
- Git的安装配置
- HBASE安装
- 函数重载
- Docker这么火,但你对它的原生网络知多少?