示例程序025--腐蚀与膨胀
2018-01-18 11:26
776 查看
本文内容在《Leaning Opencv》一书的P135。
形态学操作:
简单来讲,形态学操作就是基于形状的一系列图像处理操作。通过将 结构元素 作用于输入图像来产生输出图像。 最基本的形态学操作有二:腐蚀与膨胀(Erosion 与 Dilation)。 他们的运用广泛:
o 消除噪声
o 分割(isolate)独立的图像元素,以及连接(join)相邻的元素。
o 寻找图像中的明显的极大值区域或极小值区域。
· 通过以下图像,我们简要来讨论一下膨胀与腐蚀操作(译者注:注意这张图像中的字母为黑色,背景为白色,而不是一般意义的背景为黑色,前景为白色)
· 膨胀
·此操作将图像 与任意形状的内核 ( ),通常为正方形或圆形,进行卷积。
·内核 有一个可定义的 锚点, 通常定义为内核中心点。
· 进行膨胀操作时,将内核 划过图像,将内核 覆盖区域的最大相素值提取,并代替锚点位置的相素。显然,这一最大化操作将会导致图像中的亮区开始”扩展” (因此有了术语膨胀 dilation )。对上图采用膨胀操作我们得到:
·
· 背景(白色)膨胀,而黑色字母缩小了。
·
· 腐蚀
· 腐蚀在形态学操作家族里是膨胀操作的孪生姐妹。它提取的是内核覆盖下的相素最小值。
· 进行腐蚀操作时,将内核 划过图像,将内核 覆盖区域的最小相素值提取,并代替锚点位置的相素。
· 以与膨胀相同的图像作为样本,我们使用腐蚀操作。从下面的结果图我们看到亮区(背景)变细,而黑色区域(字母)则变大了
用到的函数主要有:
erode
dilate
createTrackbar
getStructuringElement
这些函数在代码中均已做详细介绍。
代码:
// 032 腐蚀与膨胀.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#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;
void Erosion( int, void* );
void Dilation( int, void* );
int main( int argc, char** argv )
{
/// Load 图像
src=imread("Lena.png");
if( !src.data )
{ return -1; }
/// 创建显示窗口
namedWindow( "Erosion Demo", CV_WINDOW_AUTOSIZE );
namedWindow( "Dilation Demo", CV_WINDOW_AUTOSIZE );
cvMoveWindow( "Dilation Demo", src.cols, 0 );
/// 创建腐蚀 Trackbar
//滑块滑动范围为:0-2,返回erosion_elem,代表3中不同形状的核。erosion_elem表示滑块初始位置,非trackbar的初始位置
createTrackbar( "Element:\n 0: Rect \n 1: Cross \n 2: Ellipse", "Erosion Demo",
&erosion_elem, max_elem,
Erosion );
////滑块滑动范围为:0-21,返回值为erosion_size,表示内核的大小
createTrackbar( "Kernel size:\
ab6c
n 2n +1", "Erosion Demo",
&erosion_size, max_kernel_size,
Erosion );
/// 创建膨胀 Trackbar
createTrackbar( "Element:\n 0: Rect \n 1: Cross \n 2: Ellipse", "Dilation Demo",
&dilation_elem, max_elem,
Dilation );
createTrackbar( "Kernel size:\n 2n +1", "Dilation Demo",
&dilation_size, max_kernel_size,
Dilation );
/// Default start
Erosion( 0, 0 );
Dilation( 0, 0 );
waitKey(0);
return 0;
}
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; }
//为形态学操作返回指定大小和形状的结构体,即核。erosion_type为核的类型,Size为大小,Point表示锚点
Mat element = getStructuringElement( erosion_type,
Size( 2*erosion_size + 1, 2*erosion_size+1
),
Point( erosion_size, erosion_size
) );
/// 腐蚀操作src源图,erosion_dst目标图,element核
erode( src, erosion_dst, element );
imshow( "Erosion Demo", erosion_dst );
}
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 );
}
运行结果:
形态学操作:
简单来讲,形态学操作就是基于形状的一系列图像处理操作。通过将 结构元素 作用于输入图像来产生输出图像。 最基本的形态学操作有二:腐蚀与膨胀(Erosion 与 Dilation)。 他们的运用广泛:
o 消除噪声
o 分割(isolate)独立的图像元素,以及连接(join)相邻的元素。
o 寻找图像中的明显的极大值区域或极小值区域。
· 通过以下图像,我们简要来讨论一下膨胀与腐蚀操作(译者注:注意这张图像中的字母为黑色,背景为白色,而不是一般意义的背景为黑色,前景为白色)
· 膨胀
·此操作将图像 与任意形状的内核 ( ),通常为正方形或圆形,进行卷积。
·内核 有一个可定义的 锚点, 通常定义为内核中心点。
· 进行膨胀操作时,将内核 划过图像,将内核 覆盖区域的最大相素值提取,并代替锚点位置的相素。显然,这一最大化操作将会导致图像中的亮区开始”扩展” (因此有了术语膨胀 dilation )。对上图采用膨胀操作我们得到:
·
· 背景(白色)膨胀,而黑色字母缩小了。
·
· 腐蚀
· 腐蚀在形态学操作家族里是膨胀操作的孪生姐妹。它提取的是内核覆盖下的相素最小值。
· 进行腐蚀操作时,将内核 划过图像,将内核 覆盖区域的最小相素值提取,并代替锚点位置的相素。
· 以与膨胀相同的图像作为样本,我们使用腐蚀操作。从下面的结果图我们看到亮区(背景)变细,而黑色区域(字母)则变大了
用到的函数主要有:
erode
dilate
createTrackbar
getStructuringElement
这些函数在代码中均已做详细介绍。
代码:
// 032 腐蚀与膨胀.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#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;
void Erosion( int, void* );
void Dilation( int, void* );
int main( int argc, char** argv )
{
/// Load 图像
src=imread("Lena.png");
if( !src.data )
{ return -1; }
/// 创建显示窗口
namedWindow( "Erosion Demo", CV_WINDOW_AUTOSIZE );
namedWindow( "Dilation Demo", CV_WINDOW_AUTOSIZE );
cvMoveWindow( "Dilation Demo", src.cols, 0 );
/// 创建腐蚀 Trackbar
//滑块滑动范围为:0-2,返回erosion_elem,代表3中不同形状的核。erosion_elem表示滑块初始位置,非trackbar的初始位置
createTrackbar( "Element:\n 0: Rect \n 1: Cross \n 2: Ellipse", "Erosion Demo",
&erosion_elem, max_elem,
Erosion );
////滑块滑动范围为:0-21,返回值为erosion_size,表示内核的大小
createTrackbar( "Kernel size:\
ab6c
n 2n +1", "Erosion Demo",
&erosion_size, max_kernel_size,
Erosion );
/// 创建膨胀 Trackbar
createTrackbar( "Element:\n 0: Rect \n 1: Cross \n 2: Ellipse", "Dilation Demo",
&dilation_elem, max_elem,
Dilation );
createTrackbar( "Kernel size:\n 2n +1", "Dilation Demo",
&dilation_size, max_kernel_size,
Dilation );
/// Default start
Erosion( 0, 0 );
Dilation( 0, 0 );
waitKey(0);
return 0;
}
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; }
//为形态学操作返回指定大小和形状的结构体,即核。erosion_type为核的类型,Size为大小,Point表示锚点
Mat element = getStructuringElement( erosion_type,
Size( 2*erosion_size + 1, 2*erosion_size+1
),
Point( erosion_size, erosion_size
) );
/// 腐蚀操作src源图,erosion_dst目标图,element核
erode( src, erosion_dst, element );
imshow( "Erosion Demo", erosion_dst );
}
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 );
}
运行结果:
相关文章推荐
- OpenCV 腐蚀与膨胀+轨迹条控制 综合示例
- 图像腐蚀、膨胀、基本原理和程序实现
- matlab练习程序(灰度、二值图像腐蚀膨胀)
- 图像腐蚀与膨胀综合示例
- 腐蚀与膨胀示例代码
- 图像腐蚀erode与膨胀dilate综合示例
- OpenCV膨胀和腐蚀示例代码
- OpenCV膨胀和腐蚀示例代码
- opencv图像处理——形态学腐蚀膨胀练习示例代码
- Java初级编程示例:日历小程序
- zigbee学习:示例程序SampleApp中通讯流程
- OpenCV实现图片的膨胀和腐蚀
- SAP系统自带的示例程序
- 膨胀、腐蚀、细化算法
- OpenCV学习笔记——腐蚀与膨胀
- VS2012下基于Glut 矩阵变换示例程序:
- cocos2d-x 3.x 触摸程序 示例
- linux应用层程序makefile示例
- 微信小程序form表单组件示例代码
- PJSIP学习笔记——从simple_pjsua.c示例程序了解PJSUA-LIB的基本使用流程