先膨胀再腐蚀消除裂痕:
代码:
#include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespace cv; using namespace std; //dst是膨胀后的图像,dst2是腐蚀后的图像 Mat src, dst,dst2; //膨胀的卷积核 int element_size = 3; //腐蚀的卷积核 int element_size2 = 3; int max_size = 21; char* OUTPUT_WIN = "output image"; //膨胀操作 void CallBackDilate(int, void*) { int s = element_size * 2 + 1; Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1)); dilate(src, dst, structureElement, Point(-1, -1)); imshow(OUTPUT_WIN, dst); } //腐蚀操作 void CallBackErode(int, void*) { int s = element_size * 2 + 1; Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1)); erode(dst, dst2, structureElement, Point(-1, -1)); imshow(OUTPUT_WIN, dst2); } int main() { //原图 src = imread(".//pic//1.png",IMREAD_UNCHANGED); namedWindow("input image", CV_WINDOW_AUTOSIZE); imshow("input image", src); namedWindow(OUTPUT_WIN, CV_WINDOW_AUTOSIZE); createTrackbar("膨胀卷积核大小:", OUTPUT_WIN, &element_size, max_size, CallBackDilate); createTrackbar("腐蚀卷积核大小:", OUTPUT_WIN, &element_size2, max_size, CallBackErode); CallBackDilate(0, 0); waitKey(0); return 0; }