数学形态学_腐蚀、膨胀、开运算和闭运算实验三

一、实验目的

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

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

二、实验内容

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

实验结果截图:

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

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

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

posted @ 2019-05-31 15:42  清心lh  阅读(3220)  评论(0编辑  收藏  举报