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. 在一副图像上运行此核并且显示这个结果。
- int exes2a()
- {
- CvMat *kernel;
- IplImage *img1,*img2;
- kernel = cvCreateMat(3,3,CV_32FC1);
- cvmSet(kernel,0,0,0.0625);
- cvmSet(kernel,0,1,0.125);
- cvmSet(kernel,0,2,0.0625);
- cvmSet(kernel,1,0,0.125);
- cvmSet(kernel,1,1,0.25);
- cvmSet(kernel,1,2,0.125);
- cvmSet(kernel,2,0,0.0625);
- cvmSet(kernel,2,1,0.125);
- cvmSet(kernel,2,2,0.0625);
- cvNamedWindow("exes2a1",CV_WINDOW_AUTOSIZE);
- cvNamedWindow("exes2a2",CV_WINDOW_AUTOSIZE);
- img1 = cvLoadImage("d:\\test.jpg");
- img2 = cvCloneImage(img1);
- cvFilter2D(img1,img2,kernel);
- cvShowImage("exes2a1",img1);
- cvShowImage("exes2a2",img2);
- cvWaitKey(0);
- return 0;
- }
结果看的出跑完给定的高斯核后,图像比原图像变得模糊了一些。
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()对图像做两次卷积,第一次用第一个一维核,第二次用第二个一维核。描述结果。”
- int exes2b()
- {
- CvMat *kernel1,*kernel2;
- IplImage *img1,*img2,*img3;
- kernel1 = cvCreateMat(1,3,CV_32FC1);
- kernel2 = cvCreateMat(3,1,CV_32FC1);
- cvmSet(kernel1,0,0,0.25);
- cvmSet(kernel1,0,1,0.5);
- cvmSet(kernel1,0,2,0.25);
- cvmSet(kernel2,0,0,0.25);
- cvmSet(kernel2,1,0,0.5);
- cvmSet(kernel2,2,0,0.25);
- cvNamedWindow("exes2b1",CV_WINDOW_AUTOSIZE);
- cvNamedWindow("exes2b2",CV_WINDOW_AUTOSIZE);
- cvNamedWindow("exes2b3",CV_WINDOW_AUTOSIZE);
- img1 = cvLoadImage("d:\\test.jpg");
- cvShowImage("exes2b1",img1);
- img2 = cvCloneImage(img1);
- cvFilter2D(img1,img2,kernel1);
- cvShowImage("exes2b2",img2);
- img3 = cvCloneImage(img2);
- cvFilter2D(img2,img3,kernel2);
- cvShowImage("exes2b3",img3);
- cvWaitKey(0);
- return 0;
- }
左方是原始图像。中间是第一个一维核的卷积结果,右方是第二个一维核的第二次卷积结果。从图像上来看,第二次卷积后的结果较第一次卷积的结果更为模糊。
c. 描述在 a 和 b 核的复杂度(操作次数)。差别就是可分核和所有高斯类滤波器的优点——或任何线性可分滤波器的优点,因为卷积是一个线性操作。
题目a中运行一次给定的3*3核和题目b中运行两次给定的不同的一维核的效果是等同的。即题目a中给定的3*3核可分为题目b给定的两个一维核。
阅读(2727) | 评论(0) | 转发(0) |