文章目录学习目标:使用opencv对图片进行形态学操作
- 形态学操作
- 腐蚀(erode)和扩张(dilate)
- 其他形态学操作
- 腐蚀(erode)
- 扩张(dilate)
- 开运算(先erode后dilate)
- 闭运算(先dilate后erode)
- 形态梯度 (dilate - erode)
- 顶帽 (原始图像减去开运算)
- 黑帽 (闭运算减去闭运算)
#include#include #include #include 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#include #include #include 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); }
结果:



