zoukankan      html  css  js  c++  java
  • 数学形态学_腐蚀、膨胀、开运算和闭运算实验三

    一、实验目的

    掌握数学形态学的基本理论。

    掌握数学形态学的四种基本运算,并会运用其进行简单的图像处理。

    二、实验内容

    1. 编写程序实现二值图像的腐蚀和膨胀。

    2. 编写程序实现二值图像的开运算和闭运算。

    3. 编写程序对以下图像进行形态学运算,填充内部的孔洞和外部的白色噪音块。 

    4. 编写程序实现灰度图像的腐蚀、膨胀、开运算和闭运算

    三、实验过程

    1. 编写程序实现二值图像的腐蚀和膨胀。

    实验代码如下:

    #include <opencv2/opencv.hpp>
    #include <iostream>
    
    using namespace std;
    using namespace cv;
    int main()
    {
        //将彩色图片化为二值图片
        Mat srcImg = imread("F:\work_three_grade\DigitalImage\fish.jpg");
        Mat grayImg(srcImg.size(), CV_8U);
        cvtColor(srcImg, grayImg, CV_BGR2GRAY);
        Mat binaryImg(grayImg.size(),grayImg.type());
        threshold(grayImg, binaryImg, 100, 255, THRESH_BINARY);
    
        //设置结构元素类型,大小及锚点位置。
        int elemType = MORPH_RECT;
        Mat elemStruct = getStructuringElement(elemType, Size(3, 3), Point(1, 1));
    
        //实现腐蚀
        Mat dstImg;
        erode(binaryImg, dstImg, elemStruct);
        //实现膨胀
        Mat dilImg;
        dilate(binaryImg, dilImg, elemStruct);
    
        //原图像
        namedWindow("startwindow", CV_WINDOW_NORMAL);
        imshow("startwindow", srcImg);
        //二值图片
        namedWindow("binarywindow", CV_WINDOW_NORMAL);
        imshow("binarywindow", binaryImg);
        //腐蚀
        namedWindow("dstwindow", CV_WINDOW_NORMAL);
        imshow("dstwindow", dstImg);
        //膨胀
        namedWindow("dilwindow", CV_WINDOW_NORMAL);
        imshow("dilwindow", dilImg); 
         
        waitKey();
        return 0; 
    }

    实验结果截图:第一幅图片是原图,第二幅图片是二值图,第三幅图片是腐蚀后的图片,第四幅图片是膨胀后的图片

      2.编写程序实现二值图像的开运算和闭运算。

    开运算代码如下:

    #include <opencv2/opencv.hpp>
    #include <iostream>
    
    using namespace std;
    using namespace cv;
    int main()
    {
        //将彩色图片化为二值图片
        Mat srcImg = imread("F:\work_three_grade\DigitalImage\c.jpg");
        Mat grayImg(srcImg.size(), CV_8U);
        cvtColor(srcImg, grayImg, CV_BGR2GRAY);
        Mat binaryImg(grayImg.size(),grayImg.type());
        threshold(grayImg, binaryImg, 100, 255, THRESH_BINARY);
    
        //设置结构元素类型,大小及锚点位置。
        int elemType = MORPH_ELLIPSE;
        Mat elemStruct = getStructuringElement(elemType, Size(17, 17), Point(8, 8));
    
        //实现开运算
        Mat dstImg;
        morphologyEx(binaryImg, dstImg, MORPH_OPEN, elemStruct);
    
    
        //原图像
        namedWindow("startwindow", CV_WINDOW_NORMAL);
        imshow("startwindow", srcImg);
        //二值图片
        namedWindow("binarywindow", CV_WINDOW_NORMAL);
        imshow("binarywindow", binaryImg);
        //开运算结果
        namedWindow("dstwindow", CV_WINDOW_NORMAL);
        imshow("dstwindow", dstImg);
         
        waitKey();
        return 0; 
    }

    闭运算代码如下:

    #include <opencv2/opencv.hpp>
    #include <iostream>
    
    using namespace std;
    using namespace cv;
    int main()
    {
        //将彩色图片化为二值图片
        Mat srcImg = imread("F:\work_three_grade\DigitalImage\c.jpg");
        Mat grayImg(srcImg.size(), CV_8U);
        cvtColor(srcImg, grayImg, CV_BGR2GRAY);
        Mat binaryImg(grayImg.size(),grayImg.type());
        threshold(grayImg, binaryImg, 100, 255, THRESH_BINARY);
    
        //设置结构元素类型,大小及锚点位置。
        int elemType = MORPH_ELLIPSE;
        Mat elemStruct = getStructuringElement(elemType, Size(17, 17), Point(8, 8));
    
        //实现闭运算
        Mat dstImg;
        morphologyEx(binaryImg, dstImg, MORPH_CLOSE, elemStruct);
    
    
        //原图像
        namedWindow("startwindow", CV_WINDOW_NORMAL);
        imshow("startwindow", srcImg);
        //二值图片
        namedWindow("binarywindow", CV_WINDOW_NORMAL);
        imshow("binarywindow", binaryImg);
        //闭运算结果
        namedWindow("dstwindow", CV_WINDOW_NORMAL);
        imshow("dstwindow", dstImg);
         
        waitKey();
        return 0; 
    }

    开运算结果如下:

    闭运算结果如下:

      3.编写程序对以下图像进行形态学运算,填充内部的孔洞和外部的白色噪音块。

    代码实现:

    #include <opencv2/opencv.hpp>
    #include <iostream>
    
    using namespace std;
    using namespace cv;
    int main()
    {
        //将彩色图片化为二值图片
        Mat srcImg = imread("F:\work_three_grade\DigitalImage\pic.png");
        /*Mat grayImg(srcImg.size(), CV_8U);
        cvtColor(srcImg, grayImg, CV_BGR2GRAY);
        Mat binaryImg(grayImg.size(), grayImg.type());
        threshold(grayImg, binaryImg, 100, 255, THRESH_BINARY);
        */
        //设置结构元素类型,大小及锚点位置。
        int elemType = MORPH_ELLIPSE;
        Mat elemStruct = getStructuringElement(elemType, Size(19, 19), Point(9, 9));
    
        //实现开运算
        Mat openImg;
        morphologyEx(srcImg, openImg, MORPH_OPEN, elemStruct);
    
        //再实现闭运算
        Mat closeImg;
        morphologyEx(openImg, closeImg, MORPH_CLOSE, elemStruct);
    
        //原图像
        namedWindow("startwindow", CV_WINDOW_NORMAL);
        imshow("startwindow", srcImg);
        //经过先开运算后闭运算的图像
        namedWindow("endwindow", CV_WINDOW_NORMAL);
        imshow("endwindow", closeImg);
    
    
        waitKey();
        return 0;
    }

    实验结果截图:

    上面实验是先对原图像进行开运算将外面的白色斑点去掉,此时图像里面的黑色孔洞也会相应增大,然后再进行闭运算,将孔洞填充掉,最后形成第二幅图。

    4. 编写程序实现灰度图像的腐蚀、膨胀、开运算和闭运算

    (1)腐蚀和膨胀:

    代码如下:

    #include <opencv2/opencv.hpp>
    #include <iostream>
    
    using namespace std;
    using namespace cv;
    int main()
    {
        //将彩色图片化为灰度图片
        Mat srcImg = imread("F:\work_three_grade\DigitalImage\fish.jpg");
        Mat grayImg(srcImg.size(), CV_8U);
        cvtColor(srcImg, grayImg, CV_BGR2GRAY);
        //Mat binaryImg(grayImg.size(), grayImg.type());
        //threshold(grayImg, binaryImg, 100, 255, THRESH_BINARY);
    
        //设置结构元素类型,大小及锚点位置。
        int elemType = MORPH_RECT;
        Mat elemStruct = getStructuringElement(elemType, Size(3, 3), Point(1, 1));
    
        //实现腐蚀
        Mat dstImg;
        erode(grayImg, dstImg, elemStruct);
        //实现膨胀
        Mat dilImg;
        dilate(grayImg, dilImg, elemStruct);
    
        //原图像
        namedWindow("startwindow", CV_WINDOW_NORMAL);
        imshow("startwindow", srcImg);
        //灰度图片
        namedWindow("graywindow", CV_WINDOW_NORMAL);
        imshow("graywindow", grayImg);
        //腐蚀
        namedWindow("dstwindow", CV_WINDOW_NORMAL);
        imshow("dstwindow", dstImg);
        //膨胀
        namedWindow("dilwindow", CV_WINDOW_NORMAL);
        imshow("dilwindow", dilImg);
    
        waitKey();
        return 0;
    }

    腐蚀(灰度图像,腐蚀后图像):

    膨胀(灰度图像,膨胀后图像):

    2)开运算和闭运算
    代码如下:
    #include <opencv2/opencv.hpp>
    #include <iostream>
    
    using namespace std;
    using namespace cv;
    int main()
    {
        //将彩色图片化为灰度图片
        Mat srcImg = imread("F:\work_three_grade\DigitalImage\fish.jpg");
        Mat grayImg(srcImg.size(), CV_8U);
        cvtColor(srcImg, grayImg, CV_BGR2GRAY); 
    
        //设置结构元素类型,大小及锚点位置。
        int elemType = MORPH_ELLIPSE;
        Mat elemStruct = getStructuringElement(elemType, Size(17, 17), Point(8, 8));
    
        //实现开运算
        Mat openImg;
        morphologyEx(grayImg, openImg, MORPH_OPEN, elemStruct);
        //实现闭运算
        Mat closeImg;
        morphologyEx(grayImg, closeImg, MORPH_CLOSE, elemStruct);  
         
        //灰度图片
        namedWindow("graywindow", CV_WINDOW_NORMAL);
        imshow("graywindow", grayImg);
        //开运算结果
        namedWindow("openwindow", CV_WINDOW_NORMAL);
        imshow("openwindow", openImg);
        //闭运算结果
        namedWindow("closewindow", CV_WINDOW_NORMAL);
        imshow("closewindow", closeImg);
    
        waitKey();
        return 0;
    }

    实验结果截图:

    开运算(灰度图像,开运算后的图像):

    闭运算(灰度图像,闭运算后的图像):

      终于写完了,其实好多知识有异曲同工之处~~

  • 相关阅读:
    vue 实现表格导出Excel
    基于canvas绘制的,Vue 图形验证码组件
    screenfull.js实现全屏功能
    学习笔记-Python基础2-表达式和运算符
    PHP里对数据库增删改查操作
    学习笔记-Python基础1-变量命名和声明、数据类型
    PHP类中的$this、self、parent关键字使用总结
    移动端页面中,有时需要禁止用户滑动屏幕
    正则表达式总结
    input输入框限制各类输入总结
  • 原文地址:https://www.cnblogs.com/loyolh/p/10096961.html
Copyright © 2011-2022 走看看