形态学对象的提取与屏蔽 (开操作和闭操作)

一、开操作

 

代码如下:

 

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace cv;
int main(int argc, char** argv) {
    Mat src, dst;
    src = imread("L:opencv_picture/11.png");
    if (!src.data) {
        printf("could not load image...\n");
    }
    namedWindow("input image", CV_WINDOW_AUTOSIZE);
    imshow("input image", src);
    char output_title[] = "morphology demo";
    namedWindow(output_title, CV_WINDOW_AUTOSIZE);

    Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11), Point(-1, -1));
    //getStructuringElement参数:1.形状矩形  2.形态学锚点尺寸  3.默认Point(-1, -1)锚点中心
    morphologyEx(src, dst, CV_MOP_OPEN, kernel);
    //morphologyEx参数:1.输入图像 2.输出图像 3.形态学操作 4.Mat结构元素kernel
    imshow(output_title, dst);

    waitKey(0);
    return 0;
}

 

结果:

  

 

 

 

 

二、闭操作

 

 

 

 

 

 代码入下:

 

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace cv;
int main(int argc, char** argv) {
    Mat src, dst;
    //1.
    //src = imread("L:opencv_picture/11.png");
    //2.
    src = imread("L:opencv_picture/12.png");
    if (!src.data) {
        printf("could not load image...\n");
    }
    namedWindow("input image", CV_WINDOW_AUTOSIZE);
    imshow("input image", src);
    char output_title[] = "morphology demo";
    namedWindow(output_title, CV_WINDOW_AUTOSIZE);

    Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11), Point(-1, -1));
    //getStructuringElement参数:1.形状矩形  2.形态学锚点尺寸  3.默认Point(-1, -1)锚点中心
    
    //1.开操作:
    //morphologyEx(src, dst, CV_MOP_OPEN, kernel); 
    //morphologyEx参数:1.输入图像 2.输出图像 3.形态学操作 4.Mat结构元素kernel

    //2.闭操作:
    morphologyEx(src, dst, CV_MOP_CLOSE, kernel);

    imshow(output_title, dst);

    waitKey(0);
    return 0;
}

 

结果:

      

 

 

 

 

 

 

 三、形态学梯度

 

 

 代码:

 

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace cv;
int main(int argc, char** argv) {
    Mat src, dst;
    //1.
    //src = imread("L:opencv_picture/11.png");
    //2.
    //src = imread("L:opencv_picture/12.png");
    //3.
    src = imread("L:opencv_picture/13.jpg");

    if (!src.data) {
        printf("could not load image...\n");
    }
    namedWindow("input image", CV_WINDOW_AUTOSIZE);
    imshow("input image", src);
    char output_title[] = "morphology demo";
    namedWindow(output_title, CV_WINDOW_AUTOSIZE);

    Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11), Point(-1, -1));
    //getStructuringElement参数:1.形状矩形  2.形态学锚点尺寸  3.默认Point(-1, -1)锚点中心
    
    //1.开操作:
    //morphologyEx(src, dst, CV_MOP_OPEN, kernel); 
    //morphologyEx参数:1.输入图像 2.输出图像 3.形态学操作 4.Mat结构元素kernel

    //2.闭操作:
    //morphologyEx(src, dst, CV_MOP_CLOSE, kernel);

    //3.形态学梯度:
    morphologyEx(src, dst,CV_MOP_GRADIENT , kernel);

    imshow(output_title, dst);

    waitKey(0);
    return 0;
}

 

结果:

    

 

 

 

 

四、顶帽

 

 

 代码如下:

 

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace cv;
int main(int argc, char** argv) {
    Mat src, dst;
    //1.
    //src = imread("L:opencv_picture/11.png");
    //2.
    //src = imread("L:opencv_picture/12.png");
    //3.
    //src = imread("L:opencv_picture/13.jpg");
    //4.
    src = imread("L:opencv_picture/11.png");

    if (!src.data) {
        printf("could not load image...\n");
    }
    namedWindow("input image", CV_WINDOW_AUTOSIZE);
    imshow("input image", src);
    char output_title[] = "morphology demo";
    namedWindow(output_title, CV_WINDOW_AUTOSIZE);

    Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11), Point(-1, -1));
    //getStructuringElement参数:1.形状矩形  2.形态学锚点尺寸  3.默认Point(-1, -1)锚点中心
    
    //1.开操作:
    //morphologyEx(src, dst, CV_MOP_OPEN, kernel); 
    //morphologyEx参数:1.输入图像 2.输出图像 3.形态学操作 4.Mat结构元素kernel

    //2.闭操作:
    //morphologyEx(src, dst, CV_MOP_CLOSE, kernel);

    //3.形态学梯度:
    //morphologyEx(src, dst,CV_MOP_GRADIENT , kernel);

    //4.顶帽:
    morphologyEx(src, dst,CV_MOP_TOPHAT , kernel);
    imshow(output_title, dst);

    waitKey(0);
    return 0;
}

 

 

 

结果:

 

 

 

 

 

 

 

五、黑帽

 

 

 

 

 代码如下:

 

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace cv;
int main(int argc, char** argv) {
    Mat src, dst;
    //1.
    //src = imread("L:opencv_picture/11.png");
    //2.
    //src = imread("L:opencv_picture/12.png");
    //3.
    //src = imread("L:opencv_picture/13.jpg");
    //4. 
    //src = imread("L:opencv_picture/11.png");
    //5.
    src = imread("L:opencv_picture/12.png");


    if (!src.data) {
        printf("could not load image...\n");
    }
    namedWindow("input image", CV_WINDOW_AUTOSIZE);
    imshow("input image", src);
    char output_title[] = "morphology demo";
    namedWindow(output_title, CV_WINDOW_AUTOSIZE);

    Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11), Point(-1, -1));
    //getStructuringElement参数:1.形状矩形  2.形态学锚点尺寸  3.默认Point(-1, -1)锚点中心
    
    //1.开操作:
    //morphologyEx(src, dst, CV_MOP_OPEN, kernel); 
    //morphologyEx参数:1.输入图像 2.输出图像 3.形态学操作 4.Mat结构元素kernel

    //2.闭操作:
    //morphologyEx(src, dst, CV_MOP_CLOSE, kernel);

    //3.形态学梯度:
    //morphologyEx(src, dst,CV_MOP_GRADIENT , kernel);

    //4.顶帽:
    //morphologyEx(src, dst,CV_MOP_TOPHAT , kernel);

    //5.黑帽:
    morphologyEx(src, dst,CV_MOP_BLACKHAT , kernel);

    imshow(output_title, dst);

    waitKey(0);
    return 0;
}

 

 

 

 

 

 

原图:                        闭操作图:

           

 

 

 

 

 

 黑帽为两图之差:

 

 

 

 

 

 

posted @ 2019-09-12 15:18  量子与太极  阅读(395)  评论(0编辑  收藏  举报