【练习5.9】图像掩码、礼帽、cvCopy、图像融合、cvCvtColor

提纲
题目要求
程序代码
结果图片
要言妙道

  

题目要求:

 读入一副风景图,然后将其转化为灰度图像

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

原文地址:https://www.cnblogs.com/tingshuixuan2012/p/4455632.html