Chinaunix首页 | 论坛 | 博客
  • 博客访问: 301743
  • 博文数量: 32
  • 博客积分: 665
  • 博客等级: 上士
  • 技术积分: 370
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-25 11:20
文章分类

全部博文(32)

文章存档

2023年(1)

2021年(1)

2020年(2)

2018年(3)

2014年(1)

2013年(2)

2012年(9)

2011年(9)

2010年(2)

2009年(2)

分类: C/C++

2011-08-05 17:18:55

1.用cvFilter2D()创建一个滤波器,只检测一副图像里60度角的直线。将结果显示在一个有趣的图像场景上。
-----------------------------------------------------------------------------------------
此练习一直困扰我,不明白“只检测一副图像里60度角的直线”是什么概念。cvFilter2D()是函数,在调用之后就会用指定的kernel全面地把src扫描个遍,完后放dst里。如何仅沿着一条线扫描?或者是题目理解错误?英文版原文不清楚。有明白此处的同学能否发个mail给我 。
-----------------------------------------------------------------------------------------
2.可分核。利用行[(1/16,2/16,1/16),(2/16,4/16,2/16),(1/16,2/16,1/16)]和在中间的参考点创建一个3*3的高斯核。
  a. 在一副图像上运行此核并且显示这个结果。
 
  1. int exes2a()
  2. {
  3.     CvMat *kernel;
  4.     IplImage *img1,*img2;
  5.     kernel = cvCreateMat(3,3,CV_32FC1);
  6.     cvmSet(kernel,0,0,0.0625);
  7.     cvmSet(kernel,0,1,0.125);
  8.     cvmSet(kernel,0,2,0.0625);

  9.     cvmSet(kernel,1,0,0.125);
  10.     cvmSet(kernel,1,1,0.25);
  11.     cvmSet(kernel,1,2,0.125);

  12.     cvmSet(kernel,2,0,0.0625);
  13.     cvmSet(kernel,2,1,0.125);
  14.     cvmSet(kernel,2,2,0.0625);

  15.     cvNamedWindow("exes2a1",CV_WINDOW_AUTOSIZE);
  16.     cvNamedWindow("exes2a2",CV_WINDOW_AUTOSIZE);
  17.     img1 = cvLoadImage("d:\\test.jpg");
  18.     img2 = cvCloneImage(img1);
  19.     cvFilter2D(img1,img2,kernel);
  20.     cvShowImage("exes2a1",img1);
  21.     cvShowImage("exes2a2",img2);
  22.     cvWaitKey(0);
  23.     return 0;
  24. }
 
结果看的出跑完给定的高斯核后,图像比原图像变得模糊了一些。
  b. 现在创建参考点在中心的两个核:一个“交叉”(1/4,2/4,1/4),另一个下降(1/4,2/4,1/4)。载入相同的原始图像,利用cvFilter2D()对图像做两次卷积,第一次用第一个一维核,第二次用第二个一维核。描述结果。
  这里中文翻译版题目翻译有问题。我特意去翻看英文原版,这里已经向opencv.org.cn提交勘误。这里更恰当的翻译应该是
  “创建参考点在中心的两个一维核:一个横向(1/4,2/4,1/4),另一个纵向(1/4,2/4,1/4)。载入相同的原始图像,利用cvFilter2D()对图像做两次卷积,第一次用第一个一维核,第二次用第二个一维核。描述结果。”
  1. int exes2b()
  2. {
  3.     CvMat *kernel1,*kernel2;
  4.     IplImage *img1,*img2,*img3;
  5.     kernel1 = cvCreateMat(1,3,CV_32FC1);
  6.     kernel2 = cvCreateMat(3,1,CV_32FC1);
  7.     cvmSet(kernel1,0,0,0.25);
  8.     cvmSet(kernel1,0,1,0.5);
  9.     cvmSet(kernel1,0,2,0.25);

  10.     cvmSet(kernel2,0,0,0.25);
  11.     cvmSet(kernel2,1,0,0.5);
  12.     cvmSet(kernel2,2,0,0.25);

  13.     cvNamedWindow("exes2b1",CV_WINDOW_AUTOSIZE);
  14.     cvNamedWindow("exes2b2",CV_WINDOW_AUTOSIZE);
  15.     cvNamedWindow("exes2b3",CV_WINDOW_AUTOSIZE);

  16.     img1 = cvLoadImage("d:\\test.jpg");
  17.     cvShowImage("exes2b1",img1);
  18.     img2 = cvCloneImage(img1);
  19.     cvFilter2D(img1,img2,kernel1);
  20.     cvShowImage("exes2b2",img2);
  21.     img3 = cvCloneImage(img2);
  22.     cvFilter2D(img2,img3,kernel2);
  23.     cvShowImage("exes2b3",img3);
  24.     cvWaitKey(0);
  25.     return 0;
  26. }
 
左方是原始图像。中间是第一个一维核的卷积结果,右方是第二个一维核的第二次卷积结果。从图像上来看,第二次卷积后的结果较第一次卷积的结果更为模糊。
  c. 描述在 a 和 b 核的复杂度(操作次数)。差别就是可分核和所有高斯类滤波器的优点——或任何线性可分滤波器的优点,因为卷积是一个线性操作。
  题目a中运行一次给定的3*3核和题目b中运行两次给定的不同的一维核的效果是等同的。即题目a中给定的3*3核可分为题目b给定的两个一维核。
 
阅读(2727) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~