学习目标:使用opencv对图片进行形态学操作
形态学操作
- 腐蚀(erode)
- 扩张(dilate)
- 开运算(先erode后dilate)
- 闭运算(先dilate后erode)
- 形态梯度 (dilate - erode)
- 顶帽 (原始图像减去开运算)
- 黑帽 (闭运算减去原始图像)
腐蚀(erode)和扩张(dilate)
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<opencv2/imgcodecs.hpp>
using namespace std;
using namespace cv;
// MORPH_RECT: 矩形框
// MORPH_CROSS: 十字架
// MORPH_ELLIPSE: 椭圆
Mat src, erosion_dst, dilation_dst;
int erosion_elem = 0; // 0,1,2
int erosion_size = 2;
int dilation_elem = 0; // 0,1,2
int dilation_size = 21;
void Erosion(int, void*);
void Dilation(int, void*);
int main(int, char** argv)
{
src = imread("./1.jpg", IMREAD_COLOR);
if (src.empty())
{
return -1;
}
namedWindow("Erosion Demo", 0);
namedWindow("Dilation Demo", 0);
moveWindow("Dilation Demo", src.cols, 0);
Erosion(erosion_size, &erosion_elem);
Dilation(dilation_size, &dilation_elem);
waitKey(0);
return 0;
}
void Erosion(int, void*)
{
int erosion_type = 0;
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);
}
void Dilation(int, void*)
{
int dilation_type = 0;
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);
}
结果:
其他形态学操作
- 开运算:MORPH_OPEN:2
- 闭运算:MORPH_CLOSE:3
- 形态梯度:MORPH_GRADIENT:4
- 顶帽:MORPH_TOPHAT:5
- 黑帽:MORPH_BLACKHAT:6
#include<iostream>
#include<opencv2/imgproc.hpp>
#include<opencv2/imgcodecs.hpp>
#include<opencv2/highgui.hpp>
using namespace cv;
Mat src, dst;
int morph_elem = 2;
int morph_size = 21;
int morph_operator = 4;
const char* window_name = "Morphology Transformations Demo";
void Morphology_Operations(int, void*);
int main(int argc, char** argv)
{
String imageName("./1.jpg"); // by default
if (argc > 1)
{
imageName = argv[1];
}
src = imread(imageName, IMREAD_COLOR); // Load an image
if (src.empty())
{
return -1;
}
namedWindow(window_name, 0); // Create window
Morphology_Operations(0, 0);
waitKey(0);
return 0;
}
void Morphology_Operations(int, void*)
{
// Since MORPH_X : 2,3,4,5 and 6
int operation = morph_operator + 2;
Mat element = getStructuringElement(morph_elem, Size(2 * morph_size + 1, 2 * morph_size + 1), Point(morph_size, morph_size));
morphologyEx(src, dst, operation, element);
imshow(window_name, dst);
}
结果: