一、實驗目的
掌握數學形態學的基本理論。
掌握數學形態學的四種基本運算,並會運用其進行簡單的圖像處理。
二、實驗內容
1. 編寫程序實現二值圖像的腐蝕和膨脹。
2. 編寫程序實現二值圖像的開運算和閉運算。
3. 編寫程序對以下圖像進行形態學運算,填充內部的孔洞和外部的白色噪音塊。
4. 編寫程序實現灰度圖像的腐蝕、膨脹、開運算和閉運算
三、實驗過程
- 編寫程序實現二值圖像的腐蝕和膨脹。
實驗代碼如下:
#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; }
實驗結果截圖:
開運算(灰度圖像,開運算后的圖像):
閉運算(灰度圖像,閉運算后的圖像):
終於寫完了,其實好多知識有異曲同工之處~~