zoukankan      html  css  js  c++  java
  • 【练习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)); ,则报错

  • 相关阅读:
    Notes about "Exploring Expect"
    Reuse Sonar Checkstyle Violation Report for Custom Data Analysis
    Eclipse带参数调试的方法
    MIT Scheme Development on Ubuntu
    Manage Historical Snapshots in Sonarqube
    U盘自动弹出脚本
    hg的常用配置
    Java程序员的推荐阅读书籍
    使用shared memory 计算矩阵乘法 (其实并没有加速多少)
    CUDA 笔记
  • 原文地址:https://www.cnblogs.com/tingshuixuan2012/p/4464287.html
Copyright © 2011-2022 走看看