Goal
形态学的两个基本操作
cv::dilate
Theory
首先对于灰度图像而言,0代表类黑色,255代表类白色。
膨胀:是一个求取结构化元素所覆盖内的局部最大值的处理,同时把它赋予锚点,因而带来图像(明亮部分)的扩张。
腐蚀:是一个求取结构化元素所覆盖内的局部最小值的处理,同时把它赋予锚点,因而带来图像(明亮部分)的腐蚀。
Code
代码是利用滑动条设置结构元素和结构元素的尺寸,添加的注释足够详细,不再解释。
/**
* @file Morphology_1.cpp
* @brief Erosion and Dilation sample code
* @author OpenCV team
*/
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;
// Global variables
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( int argc, char** argv )
{
// Load an image
//命令行解析类,
// 参数名,参数value(可以为),help信息(可以为空)
CommandLineParser parser( argc, argv, "{@input | lena.jpg | input image}" ); //进行修改了参数位置
src = imread( parser.get<String>( "@input" ), IMREAD_COLOR );
if( src.empty() )
{
cout << "Could not open or find the image!\n" << endl;
cout << "Usage: " << argv[0] << " <Input image>" << endl;
return -1;
}
// Create windows
namedWindow( "Erosion Demo", WINDOW_AUTOSIZE );
namedWindow( "Dilation Demo", WINDOW_AUTOSIZE );
moveWindow( "Dilation Demo", src.cols, 0 );//名称,新的X,新的Y
// Create Erosion Trackbar
//名称,窗口 ,滑动条位置,最大,回调函数
createTrackbar( "Element:\n 0: Rect \n 1: Cross \n 2: Ellipse", "Erosion Demo",
&erosion_elem, max_elem,
Erosion );
createTrackbar( "Kernel size:\n 2n +1", "Erosion Demo",
&erosion_size, max_kernel_size,
Erosion );
// Create Dilation 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;
}
CMakeLists.txt文件同上一篇相同。
运行结果如下图所示: