【练习6.1】阈值化、腐蚀、cvFilter2D及自定义滤波器

 

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

 

 

 

  

 

题目要求:

 用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度的线,不过,程序中还是用了阈值化和腐蚀,滤波器应该还有调节的空间

 

posted on 2015-04-26 22:02  毋忆典藏  阅读(1017)  评论(2编辑  收藏  举报