题目要求:
可分核。利用行[(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 #include8 #include 9 #include 10 11 #include 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)); ,则报错