题目要求 |
程序代码 |
结果图片 |
要言妙道 |
读入一副风景图,然后将其转化为灰度图像
a、对图像进行形态学“礼帽”操作,并显示结果
b、将结果图像转化为8位的掩码
c、复制灰度值到礼帽块中,显示结果→我的理解是,将第a问与b问的结果图片融合成一副图
1 // OpenCVExerciseTesting.cpp : 定义控制台应用程序的入口点。 2 // 3 //D:\\Work\\Work_Programming\\Source\\Image\\lena.jpg 4 5 6 #include "stdafx.h" 7 #include <cv.h> 8 #include <highgui.h> 9 #include <iostream> 10 using namespace cv; 11 using namespace std; 12 13 //函数声明-->--->-->--->-->--->-->--->// 14 15 //<--<--<--<--<--<--<--<--<--函数声明// 16 17 18 int _tmain(int argc, _TCHAR* argv[]) 19 { 20 const char * fileName1 = "D:\\Work\\Work_Programming\\Source\\Image\\OpenCVExerciseImage\\第5章\\风景.jpg"; 21 IplImage * src1 = cvLoadImage(fileName1, CV_LOAD_IMAGE_UNCHANGED); 22 assert(src1); 23 24 cvNamedWindow("原始图像", 0); 25 cvNamedWindow("题目_a", 0); 26 cvNamedWindow("题目_b", 0); 27 cvNamedWindow("题目_c", 0); 28 29 IplImage * img_Gray = cvCreateImage(cvSize(src1->width, src1->height), IPL_DEPTH_8U, 1); 30 31 //使用cvCvtColor和cvCopy这些函数前,都应该对参数进行验证再使用 32 if (src1->nChannels != 3) 33 { 34 cout << "加载的图像必须为彩色图片" << endl; 35 return 0; 36 } 37 38 cvCvtColor(src1, img_Gray, CV_RGB2GRAY); 39 40 cvShowImage("原始图像", img_Gray); 41 42 //---------------------------a:开始--------------------------------// 43 44 45 IplImage * imgCopy = cvCloneImage(img_Gray); 46 cvZero(imgCopy); 47 48 IplConvKernel * kernel = cvCreateStructuringElementEx(3, 3, 1, 1, CV_SHAPE_RECT); 49 cvMorphologyEx(img_Gray, imgCopy, NULL, kernel, CV_MOP_TOPHAT,6); 50 51 cvShowImage("题目_a", imgCopy); 52 53 //---------------------------a:结束--------------------------------// 54 55 //---------------------------b:开始--------------------------------// 56 57 58 IplImage * imgCopy_b = cvCloneImage(img_Gray); 59 cvZero(imgCopy_b); 60 61 cvThreshold(imgCopy, imgCopy_b, 50, 255, CV_THRESH_BINARY); 62 63 cvShowImage("题目_b", imgCopy_b); 64 65 //---------------------------b:结束--------------------------------// 66 67 //---------------------------c:开始--------------------------------// 68 69 70 IplImage * imgCopy_c = cvCloneImage(imgCopy); 71 //cvZero(imgCopy_c); 72 73 cvCopy(imgCopy_b, imgCopy_c, imgCopy_b); 74 75 cvShowImage("题目_c", imgCopy_c); 76 77 //---------------------------c:结束--------------------------------// 78 79 cvWaitKey(0); 80 81 cvReleaseImage(&src1); 82 cvReleaseImage(&imgCopy); 83 cvReleaseImage(&imgCopy_b); 84 cvReleaseImage(&imgCopy_c); 85 86 cvDestroyWindow("原始图像"); 87 cvDestroyWindow("题目_a"); 88 cvDestroyWindow("题目_b"); 89 cvDestroyWindow("题目_c"); 90 91 return 0; 92 } 93
①使用cvCvtColor、cvCopy等函数时,注意验证输入图片的有效性,不然会报错,例如:
1 //使用cvCvtColor和cvCopy这些函数前,都应该对参数进行验证再使用 2 if (src1->nChannels != 3) 3 { 4 cout << "加载的图像必须为彩色图片" << endl; 5 return 0; 6 } 7 8 cvCvtColor(src1, img_Gray, CV_RGB2GRAY);
②制作掩码图像其实就是二值化图像,使用漫水填充法也可以得到掩码图像,而且其中有关于mask的参数图像的用法
③可以使用cvCopy进行图像融合,利用上第三个参数
④礼帽和黑帽:这些操作分别用于分离比邻近的点亮或暗的一些斑块。所以,可用于实现类似Cognex的CogBlobTool功能,OpenCV中有类似描述Blob的结果:CvConnectedComponent