數學形態學_腐蝕、膨脹、開運算和閉運算實驗三


一、實驗目的

掌握數學形態學的基本理論。

掌握數學形態學的四種基本運算,並會運用其進行簡單的圖像處理。

二、實驗內容

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

實驗結果截圖:

開運算(灰度圖像,開運算后的圖像):

閉運算(灰度圖像,閉運算后的圖像):

  終於寫完了,其實好多知識有異曲同工之處~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM