• 【练习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)); ,则报错

  • 相关阅读:
    4412开发板QtE系统下MT6620wifi的测试
    如何编译(helloworld)可以在开发板上运行的应用
    iMX6Q/PLUS开发板烧写设备树内核的Ubuntu系统
    Windows server 2008系统优化
    三十句瞬间使你清醒的话
    收集的Word2007技巧大全
    WINDOWS系统文件详解
    注册表从入门到精通
    140个绝对绝对值得收藏的电脑技巧
    经典人生感悟格言
  • 原文地址:https://www.cnblogs.com/tingshuixuan2012/p/4464287.html
Copyright © 2020-2023  润新知