资源简介
生成高斯模板,模板大小、均值、方差等参数可自己手动设置。利用生成的模板进行高斯滤波。
代码片段和文件信息
#include “cv.h“
#include “highgui.h“
#include “math.h“
#include “stdio.h“
bool FunGauss(int Nfloat sigmaint* iTemplatefloat* fCof);
int main(int argcchar** argv)
{
IplImage* src;
if (argc == 2 && (src = cvLoadImage(argv[1]0)) != 0)
{
//高斯滤波后图像
IplImage* dst_Gauss = cvCreateImage(cvGetSize(src)src->depthsrc->nChannels);
cvCopy(srcdst_GaussNULL);
//原图像与高斯滤波后图像之差
IplImage* dst_differ = cvCreateImage(cvGetSize(src)src->depthsrc->nChannels);
int ijmn; //循环变量
int iGray; //灰度值
float fC = 0; //高斯模板系数
int N = 3; //模板边长的一半
int* iTemplate = new int[(2*N+1)*(2*N+1)];
FunGauss(N2.0iTemplate&fC); //生成N*N高斯模板,系数存放在iTemplate里
//显示生成的高斯模板系数
for (i=0;i<2*N+1;i++)
{
for (j=0;j<2*N+1;j++)
{
printf(“%d “iTemplate[i*(2*N+1)+j]);
if (j == 2*N)
{
printf(“\n“);
}
}
}
for (i=N+1;iheight-N-1;i++)
{
for (j=N+1;jwidth-N-1;j++)
{
iGray = 0;
for (m=0;m<2*N+1;m++)
{
for (n=0;n<2*N+1;n++)
{
iGray +=
(int)((uchar*)(src->imageData+(i-N-1+m)*src->widthStep))[j-N-1+m]
*iTemplate[m*(2*N+1)+n];
}
}
((uchar*)(dst_Gauss->imageData+i*src->widthStep))[j] = (uchar)(iGray*fC);
}
}
cvNamedWindow(“src“1);
cvShowImage(“src“src);
cvNamedWindow(“dst_Gauss“1);
cvShowImage(“dst_Gauss“dst_Gauss);
cvWaitKey(0);
cvDestroyWindow(“src“);
cvReleaseImage(&src);
cvDestroyWindow(“dst_Gauss“);
cvReleaseImage(&dst_Gauss);
return 0;
}
return -1;
}
bool FunGauss(int Nfloat sigmaint* iTemplatefloat* fCof)
{
int ij; //循环变量
float t; //指数部分
int C; //归一化系数
float* fTemp =new float[(N+1)*(N+1)];
int* iMat = new int[(2*N+1)*(2*N+1)];
int* iArray =new int[(2*N+1)*(2*N+1)];
iArray = iTemplate;
for (i=0;i {
for (j=0;j {
t=(float)(i*i+j*j)/(float)pow(sigma2); //计算指数项
fTemp[i*(N+1)+j] = (float)(1.0/exp(t/2)); //计算高斯函数离散化后对应的模板取值
}
}
C = (int)ceil(1/fTemp[(N+1)*(N+1)-1]+0.5); // 计算归一化系数
//给模板右下角赋值
for (i=0;i {
for (j=0;j {
iMat[(N+i)*(2*N+1)+(N+j)] = (int)(fTemp[i*(N+1)+j]*C+0.5);
}
}
//给模板左下角赋值
for (i=N;i<2*N+1;i++)
{
for (j=0;j {
iMat[i*(2*N+1)+j] = iMat[i*(2*N+1)+(2*N-j)];
}
}
//给模板上半部分赋值
for (i=0;i {
for (j=0;j<2*N+1;j++)
{
iMat[i*(2*N+1)+j] = iMat[(2*N-i)*(2*N+1)+j];
}
}
//计算总系数
for (i=0;i<2*N+1;i++)
{
for (j=0;j<2*N+1;j++)
{
*fCof += (float)iMat[i*(2*N+1)+j];
}
}
*fCof = (float)1.0/(*fCof);
//将得到的模板数返回
for (i=0;i<2*N+1;i++)
{
for (j=0;j<2*N+1;j++)
{
iArray[i*(2*N+1)+j] = iMat[i*(2*N+1)+j];
}
}
delete iMat;
delete fTemp;
return TRUE;
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 217154 2009-03-31 12:50 Gaussian_高斯滤波\Debug\Gaussian.exe
文件 236072 2009-03-31 12:50 Gaussian_高斯滤波\Debug\Gaussian.ilk
文件 18014 2009-03-31 12:50 Gaussian_高斯滤波\Debug\Gaussian.obj
文件 4109316 2009-03-31 12:45 Gaussian_高斯滤波\Debug\Gaussian.pch
文件 484352 2009-03-31 12:50 Gaussian_高斯滤波\Debug\Gaussian.pdb
文件 164864 2009-03-31 12:50 Gaussian_高斯滤波\Debug\vc60.idb
文件 94208 2009-03-31 12:50 Gaussian_高斯滤波\Debug\vc60.pdb
目录 0 2009-09-28 10:35 Gaussian_高斯滤波\Debug
文件 2979 2009-03-31 12:50 Gaussian_高斯滤波\Gaussian.cpp
文件 4393 2009-03-27 15:47 Gaussian_高斯滤波\Gaussian.dsp
文件 522 2009-03-27 14:36 Gaussian_高斯滤波\Gaussian.dsw
文件 41984 2009-04-03 12:10 Gaussian_高斯滤波\Gaussian.ncb
文件 54784 2009-04-03 12:10 Gaussian_高斯滤波\Gaussian.opt
文件 1359 2009-03-31 12:50 Gaussian_高斯滤波\Gaussian.plg
目录 0 2009-04-03 12:10 Gaussian_高斯滤波
----------- --------- ---------- ----- ----
5430001 15
- 上一篇:深度优先搜索实现八数码问题
- 下一篇:用QT写UART串口曲线变化
评论
共有 条评论