题目要求 |
程序代码 |
结果图片 |
要言妙道 |
用cvFilter2D创建一个滤波器,只检测一副图像里的60度角的直线。将结果显示。做一下分部步操作:
a、自定义卷积核,使用cvFilter2D,处理图像
b、对a的结果图片阈值化,是60度上的直线更清晰
c、对b的结果腐蚀
备注:
对于这道题,我的理解是,只保留一副图片60度角上的直线,是为了增加对自定义滤波器的熟悉度
在Opencv卷积滤波cvFilter2D一文中有更多常用的滤波器模板可以借鉴
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章\各角度直线.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 cvNamedWindow("题目_c", 0); 32 33 IplImage * image_Gray = cvCreateImage(cvSize(image_Resource->width, image_Resource->height), IPL_DEPTH_8U, 1); 34 35 //使用cvCvtColor和cvCopy这些函数前,都应该对参数进行验证再使用 36 if (image_Resource->nChannels == 3) 37 { 38 cvCvtColor(image_Resource, image_Gray, CV_RGB2GRAY); 39 } 40 else 41 { 42 image_Gray = cvCloneImage(image_Resource); 43 } 44 45 cvShowImage("原始图像", image_Gray); 46 47 //---------------------------a:--------------------------------/: 48 49 float matData[49] = { 50 0.0f, 0.0f, 0.0f, 0.0f, 0.11f, 0.7f, 0.0f, 51 0.0f, 0.0f, 0.0f, 0.0f, 0.4f, 0.0f, 0.0f, 52 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 53 0.0f, 0.0f, 0.0f, 0.8f, 0.0f, 0.0f, 0.0f, 54 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 55 0.0f, 0.0f, 0.4f, 0.0f, 0.0f, 0.0f, 0.0f, 56 0.0f, 0.7f, 0.11f, 0.0f, 0.0f, 0.0f, 0.0f 57 }; 58 59 CvMat mat = cvMat(7, 7, CV_32FC1, matData); 60 61 IplImage * image_Result_a = cvCloneImage(image_Gray); 62 cvZero(image_Result_a); 63 64 cvFilter2D(image_Gray, image_Result_a, &mat); 65 cvShowImage("题目_a", image_Result_a); 66 67 //---------------------------a:--------------------------------/。 68 69 //---------------------------b:--------------------------------/: 70 71 IplImage *image_Threshold = cvCloneImage(image_Result_a); 72 cvZero(image_Threshold); 73 cvThreshold(image_Result_a, image_Threshold, 253, 255, CV_THRESH_BINARY); 74 75 cvShowImage("题目_b", image_Threshold); 76 77 //---------------------------b:--------------------------------/。 78 79 80 //---------------------------c:--------------------------------/: 81 82 IplImage * image_Erode = cvCloneImage(image_Threshold); 83 cvZero(image_Erode); 84 IplConvKernel *kernel = cvCreateStructuringElementEx(3, 3, 0, 0, CV_SHAPE_RECT); 85 cvErode(image_Threshold, image_Erode, kernel); 86 87 cvShowImage("题目_c", image_Erode); 88 89 //---------------------------c:--------------------------------/。 90 91 cvWaitKey(0); 92 93 cvReleaseImage(&image_Resource); 94 cvReleaseImage(&image_Result_a); 95 cvReleaseImage(&image_Threshold); 96 cvReleaseImage(&image_Erode); 97 98 cvDestroyWindow("原始图像"); 99 cvDestroyWindow("题目_a"); 100 cvDestroyWindow("题目_b"); 101 cvDestroyWindow("题目_c"); 102 103 return 0; 104 } 105
①消除45度线比较费工夫,可以把matData的第一行看作是对如下角度的调节:145度 130度 105度 90度 75度 60度 45度,这样增大60度和75度的权值,就可以消除图中45度的线,不过,程序中还是用了阈值化和腐蚀,滤波器应该还有调节的空间