一、实验目的
掌握数学形态学的基本理论。
掌握数学形态学的四种基本运算,并会运用其进行简单的图像处理。
二、实验内容
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; }
实验结果截图:
开运算(灰度图像,开运算后的图像):
闭运算(灰度图像,闭运算后的图像):
终于写完了,其实好多知识有异曲同工之处~~