zoukankan      html  css  js  c++  java
  • 【练习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度的线,不过,程序中还是用了阈值化和腐蚀,滤波器应该还有调节的空间

  • 相关阅读:
    Windows API 中 OVERLAPPED 结构体 初始化
    QString 转换成 wchar 的一个小陷阱
    Windows VHD Create, Attach, 获得Disk序号
    Programmatically mount a Microsoft Virtual Hard Drive (VHD)
    chcp437 转换英语,在西班牙语系统中无效
    Windows 版本 Enterprise、Ultimate、Home、Professional
    openssl 查看证书
    Ubuntu 搜索文件
    微软的 Sysinternals 系统管理工具包,例如可找出自动启动的流氓软件
    HTML 表格实例
  • 原文地址:https://www.cnblogs.com/tingshuixuan2012/p/4458508.html
Copyright © 2011-2022 走看看