【练习6.2】cvFilter2D及3×3高斯核、cvFilter2D当使用一维核时anchor注意事项、float乘法除法注意事项

 

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

 

 

 

  

 

题目要求:

 可分核。利用行[(1/16,2/16,1/16),(2/16,4/16,2/16),(1/16,2/16,1/16)]和在中间的参考点创建一个3*3的高斯核。

a、在一副图像上运行此核并且显示这个结果。 

b、现在创建参考点在中心的两个核:一个“交叉”(1/4,2/4,1/4),另一个下降(1/4,2/4,1/4)。载入相同的原始图像,利用cvFilter2D()对图像做两次卷积,第一次用第一个一维核,第二次用第二个一维核。描述结果。

针对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 
 11 #include <opencv2/legacy/legacy.hpp>
 12 //#pragma comment(lib, "opencv_legacy2411.lib")
 13 
 14 using namespace cv;
 15 using namespace std;
 16 
 17 //函数声明-->--->-->--->-->--->-->--->//
 18 
 19 
 20 //<--<--<--<--<--<--<--<--<--函数声明//
 21 
 22 int _tmain(int argc, _TCHAR* argv[])
 23 {
 24     const char * soutceFile = "D:\\Work\\Work_Programming\\Source\\Image\\OpenCVExerciseImage\\第5章\\RCA_Indian_Head_test_pattern.jpg";
 25     IplImage * image_Resource = cvLoadImage(soutceFile, CV_LOAD_IMAGE_UNCHANGED);
 26     assert(image_Resource);
 27 
 28     cvNamedWindow("原始图像", 0);
 29     cvNamedWindow("题目_a", 0);
 30     cvNamedWindow("题目_b", 0);
 31 
 32     IplImage * image_Gray = cvCreateImage(cvSize(image_Resource->width, image_Resource->height), IPL_DEPTH_8U, 1);
 33 
 34     //使用cvCvtColor和cvCopy这些函数前,都应该对参数进行验证再使用
 35     if (image_Resource->nChannels == 3)
 36     {
 37         cvCvtColor(image_Resource, image_Gray, CV_RGB2GRAY);
 38     }
 39     else
 40     {
 41         image_Gray = cvCloneImage(image_Resource);
 42     }
 43 
 44     cvShowImage("原始图像", image_Gray);
 45 
 46     //---------------------------a:--------------------------------/:
 47 
 48     //●●●●●●●●●●●●●●●●●●●/:
 49     //使用下面的形式,结果是错误的,因为1/16的结果是0.000000000,必须这样才行,那就不如下面的方式
 50     //float matData[9] = {
 51     //    (1 / 16), (2 / 16), (1 / 16),
 52     //    (2 / 16), (4 / 16), (2 / 16),
 53     //    (1 / 16), (2 / 16), (1 / 16)
 54     //};
 55     //●●●●●●●●●●●●●●●●●●●/。
 56 
 57     float atomValue = (float)1 / (float)16;
 58     float multiplier_2 = 2.0f;
 59     float multiplier_4 = 4.0f;
 60 
 61     float matData[9] = {
 62         atomValue, atomValue*multiplier_2, atomValue,
 63         atomValue * multiplier_2, atomValue * multiplier_4, atomValue * multiplier_2,
 64         atomValue, atomValue * multiplier_2 , atomValue
 65     };
 66 
 67     CvMat mat = cvMat(3, 3, CV_32FC1, matData);
 68 
 69     IplImage * image_Result_a = cvCloneImage(image_Gray);
 70     cvZero(image_Result_a);
 71 
 72     cvFilter2D(image_Gray, image_Result_a, &mat);
 73     cvShowImage("题目_a", image_Result_a);
 74 
 75     //---------------------------a:--------------------------------/。
 76 
 77     //---------------------------b:--------------------------------/:
 78 
 79     IplImage *image_Result_b = cvCloneImage(image_Gray);
 80     cvZero(image_Result_b);
 81 
 82     atomValue = (float)1 / (float)4;
 83 
 84     CvMat *mat_b = cvCreateMat(1, 3, CV_32FC1);
 85     cvmSet(mat_b, 0, 0, atomValue);
 86     cvmSet(mat_b, 0, 1, atomValue * multiplier_2);
 87     cvmSet(mat_b, 0, 2, atomValue);
 88 
 89     CvMat* mat_b_2 = cvCreateMat(3, 1, CV_32FC1);
 90     cvmSet(mat_b_2, 0, 0, atomValue);
 91     cvmSet(mat_b_2, 1, 0, atomValue * 2);
 92     cvmSet(mat_b_2, 2, 0, atomValue);
 93 
 94     cvFilter2D(image_Gray, image_Result_b, mat_b);
 95     cvFilter2D(image_Result_b, image_Result_b, mat_b_2);
 96 
 97     cvShowImage("题目_b", image_Result_b);
 98 
 99     //---------------------------b:--------------------------------/。
100 
101     cvWaitKey(0);
102 
103     cvReleaseImage(&image_Resource);
104     cvReleaseImage(&image_Result_a);
105     cvReleaseImage(&image_Result_b);
106     cvReleaseMat(&mat_b);
107     cvReleaseMat(&mat_b_2);
108 
109     cvDestroyWindow("原始图像");
110     cvDestroyWindow("题目_a");
111     cvDestroyWindow("题目_b");
112 
113     return 0;
114 }

 

 

结果图片:

 

要言妙道:

 ①int型相除如果想得的float,必须提前强转,例如: float atomValue = (float)1 / (float)16; 

②使用cvFliter2D的时候,如果使用的是一位和,则anchor的值只能使用默认值,即cvPoint(-1,-1),如果想自定义,会报错,但测试3×3核时,自定义anchor运行正常,例如上述代码中b部分的  cvFilter2D(image_Gray, image_Result_b, mat_b); 如果更改为 cvFilter2D(image_Gray, image_Result_b, mat_b,cvPoint(0,2)); ,则报错

 

posted on 2015-04-28 22:47  毋忆典藏  阅读(2286)  评论(0编辑  收藏  举报