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;
    }

    实验结果截图:

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

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

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

  • 相关阅读:
    poj3032
    poj2603
    poj2019
    poj2369
    AVI 录像功能压缩算法设置
    陆其明的新书《脚本驱动的应用软件开发方法与实践》
    c# 动态编译
    !!!分享:把bmp格式的图片转化为AVI格式的视频操作的封装类其中对于AVI API的函数的使用较为完整
    视频文件格式和视频编码方式
    activex 控件的id 定义位置+使用ocx控件的客户端程序中对控件定义的文件中控件id定义的位置
  • 原文地址:https://www.cnblogs.com/loyolh/p/10096961.html
Copyright © 2011-2022 走看看