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

时间: 2024-10-21 09:51:51

【练习6.2】cvFilter2D及3×3高斯核、cvFilter2D当使用一维核时anchor注意事项、float乘法除法注意事项的相关文章

核与线程 CPU 4核8线程 的解释

1.物理CPU: 物理CPU就是计算机上实际配置的CPU个数.在linux上可以打开cat /proc/cpuinfo 来查看,其中的physical id就是每个物理CPU的ID,能找到几个physical id就代表计算机实际有几个CPU. 在linux下可以通过指令 grep ‘physical id’ /proc/cpuinfo | sort -u | wc -l 来查看物理CPU个数. 2.cpu核数:linux的cpu核心总数也可以在/proc/cpuinfo里面通过指令cat /p

Altera DDR2 IP核学习总结2-----------DDR2 IP核的生成

打开IP核工具,然后选择Verilog HDL选项,填写路径,写入文件名DDR2_IP.V,点击next PLL reference clock frequency填入板子晶振的频率50MHZ,这里设置Memory clock frequency为133MHZ,Controller data rate 为Full模式. 芯片型号如果有相同的就选相同的,如果没有就选类似的,然后修改参数.这里选择 然后点击Modify parameters设置参数,也可以选择Loda Preset载入设置好的参数

Altera DDR2 IP核学习总结3-----------DDR2 IP核的使用

根据上一篇生成的IP核,例化之后如上图,Local开头的数据是用户侧数据,其他数据暂时不用纠结,不用管. 这些是需要关注的信号,但是初学阶段很难对这些信号形成具体的概念,这里参考明德扬的代码进行二次封装. module ddr2_intf( clk_in           , clk_out          , rst_n            , local_address    , local_write_req  , local_read_req   , local_wdata    

PhotoShop算法实现进阶-模糊滤镜-高斯滤波(二十三)

PhotoShop算法实现进阶-模糊滤镜-高斯滤波(二十三) [email protected] http://blog.csdn.net/kezunhai 高斯模糊(Gaus Blur)采用二维高斯模板对图像进行模糊处理,用于图像模糊化(去除细节和噪声),它的处理效果给人一种更佳柔和的感觉. 一维高斯: 二维高斯: 理论上,高斯分布在所有定义域上都有非负值,这就需要一个无限大的卷积核.实际上,仅需要取均值周围3倍标准差内的值,以外部份直接去掉即可. 如下图为一个标准差为1.0的整数值高斯核:

【DFS好题】BZOJ1999- [Noip2007]Core树网的核(数据加强版)

NOIP的数据好水,一开始有好几个错结果NOIP数据就水过了?? [题目大意] 求无根树的直径上一段不超过S长的链,使得偏心距最小.具体概念见原题. [思路] 首先明确几个性质: (1)对于树中的任意一点,距离其最远的点一定是树的直径的某一端点. (2)所有的直径是等价的,即任意一条所能求出的该最小偏心距相等. 于是我们可以用两次dfs求出直径.任取一个点找到离它最远的点r,再从r找到距离它最远的点l.l到r的路径就是直径. 显然在长度不超过S的情况下,链最长最好.在l到r上维护尽可能长的链,找

SIFT解析(一)建立高斯金字塔

转自:honpey  http://blog.csdn.net/wendy709468104/article/details/8639617 SIFT(Scale-Invariant Feature Transform,尺度不变特征转换)在目标识别.图像配准领域具有广泛的应用,下面按照SIFT特征的算法流程对其进行简要介绍对SIFT特征做简要介绍. 高斯金字塔是SIFT特征提取的第一步,之后特征空间中极值点的确定,都是基于高斯金字塔,因此SIFT特征学习的第一步是如何建立的高斯金字塔. 明白几个

核主成分分析(Kernel Principal Component Analysis, KPCA)的公式推导过程

KPCA,中文名称"核主成分分析",是对PCA算法的非线性扩展,言外之意,PCA是线性的,其对于非线性数据往往显得无能为力,例如,不同人之间的人脸图像,肯定存在非线性关系,自己做的基于ORL数据集的实验,PCA能够达到的识别率只有88%,而同样是无监督学习的KPCA算法,能够轻松的达到93%左右的识别率(虽然这二者的主要目的是降维,而不是分类,但也可以用于分类),这其中很大一部分原因是,KPCA能够挖掘到数据集中蕴含的非线性信息. 1. 理论部分 KPCA的公式推导和PCA十分相似,只

【opencv学习笔记1】5种图像滤波辨析:方框、均值、高斯、中值、双边

图像滤波 什么是图像滤波 图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性. 图像滤波的目的 a.消除图像中混入的噪声 b.为图像识别抽取出图像特征 图像滤波的要求 a.不能损坏图像轮廓及边缘 b.图像视觉效果应当更好 滤波器的定义 滤波器,顾名思义,是对波进行过滤的器件.(摘自网络) 以上的定义是针对物理器件的,但对于图像滤波而言显然也是适用的. 大家都用过放大镜,这里就以此举一个例

基于核方法的模糊C均值聚类

摘要: 本文主要针对于FCM算法在很大程度上局限于处理球星星团数据的不足,引入了核方法对算法进行优化.  与许多聚类算法一样,FCM选择欧氏距离作为样本点与相应聚类中心之间的非相似性指标,致使算法趋向于发现具有相近尺度和密度的球星簇.因此,FCM很大程度上局限于对球星星团的处理,不具有普遍性.联系到支持向量机中的核函数,可采用核方法将数据映射到高维特征空间进行特征提取从而进行聚类.现阶段,核方法已广泛应用于模糊聚类分析算法.核方法的应用目前已成为计算机智能方面的热点之一,对于核学习的深入研究具有