您的位置:首页 > 其它

高斯

2015-10-20 18:29 134 查看
// 代码

// 代码1(自己实现的)
void MakeGauss()
{
double sigma = 1.4; // σ是正态分布的标准偏差 这里为 1.4
double dResult[5][5]; // 用于存储结果
double dResult1[5][5]; // 用于存储结果

// 数组的中心点
int nCenterX = 2, nCenterY = 2; // 中心点位置以1开始的吧
int nSize = 5;
// 数组的某一点到中心点的距离
double dDis;
double PI = 3.1415926535;
// 中间变量
double dValue;
double dSum ;
dSum = 0 ;
int i, j;

for(i = 0; i< nSize; ++i)
{
for(j = 0; j < nSize; ++j)
{
dDis = (i - nCenterX) * (i - nCenterX) + (j - nCenterY) * (j - nCenterY);
dValue = exp( - dDis / (2 * sigma * sigma)) /
(2 * PI * sigma * sigma);
dResult[i][j] = dValue;
dSum += dValue;
}
}
// 归一化
for(i = 0; i< nSize; ++i)
{
for(j = 0; j < nSize; ++j)
{
dResult1[i][j] = dResult[i][j] / dSum;
}
}
std::cout << dSum << std::endl;
for(i = 0; i< nSize; ++i)
{
for(j = 0; j < nSize; ++j)
{
// dResult1才是高斯的结果, 但是dResult * 1.95 * 100却得到了文章上说的结果
// 一个标准差为1.4的高斯5x5的卷积核
// 暂时不知道为什么。
std::cout << (int)(dResult[i][j] * 1.95 * 100) << " ";
}
std::cout << std::endl; }图1. N维空间正态分布方程(该公式与图2的是同一个)

高斯模糊是一种图像模糊滤波器,它用正态分布计算图像中每个像素的变换。
N 维空间正态分布方程为

(图2)
在二维空间定义为

(图3)
其中 r 是模糊半径 (r2 = u2 + v2),σ 是正态分布的标准偏差。
在二维空间中,这个公式生成的曲面的等高线是从中心开始呈正态分布的同心圆。分布不为零的像素组成的卷积矩阵与原始图像做变换。

一个标准差为1.4的高斯5x5的卷积核:

2   4   5   4   2
4   9   12   9   4
5   12   15   12   5
4   9   12   9   4
2   4   5   4   2

最后乘以比例系数   1/115

// 代码

// 代码1(自己实现的)
void MakeGauss()
{
double sigma = 1.4;     // σ是正态分布的标准偏差 这里为 1.4
double dResult[5][5];    // 用于存储结果
double dResult1[5][5];    // 用于存储结果

// 数组的中心点
int nCenterX = 2, nCenterY = 2;  // 中心点位置以1开始的吧
int nSize = 5;
// 数组的某一点到中心点的距离
double  dDis;
double PI = 3.1415926535;
// 中间变量
double  dValue;
double  dSum  ;
dSum = 0 ;
int i, j;

for(i = 0; i< nSize; ++i)
{
for(j = 0; j < nSize; ++j)
{
dDis = (i - nCenterX) * (i - nCenterX) + (j  - nCenterY) * (j - nCenterY);
dValue = exp( - dDis / (2 * sigma * sigma)) /
(2 * PI * sigma * sigma);
dResult[i][j] = dValue;
dSum += dValue;
}
}
// 归一化
for(i = 0; i< nSize; ++i)
{
for(j = 0; j < nSize; ++j)
{
dResult1[i][j] = dResult[i][j] / dSum;
}
}
std::cout << dSum << std::endl;
for(i = 0; i< nSize; ++i)
{
for(j = 0; j < nSize; ++j)
{
// dResult1才是高斯的结果, 但是dResult * 1.95 * 100却得到了文章上说的结果
// 一个标准差为1.4的高斯5x5的卷积核
// 暂时不知道为什么。
std::cout << (int)(dResult[i][j] * 1.95 * 100) << "  ";
}
std::cout << std::endl;
}
}

// 代码2(网上找的)
void Gauss()
{
int h_size;
float siz,sigma;
int i, j;
printf("Please input size of gaussian core/n");
scanf("%d",&h_size);
printf("Please input sigma:/n");
scanf("%f",&sigma);
siz=(h_size-1)/2;
float **a,**b;
a=new float*[h_size];
for(int i=0;i<h_size;i++)   a[i]=new float[h_size];
b=new float*[h_size];
for( i=0;i<h_size;i++)   b[i]=new float[h_size];
for(i=0;i<h_size;i++)
{
for(j=0;j<h_size;j++)
{
a[i][j]=-siz+j;
printf("%4.2f ",a[i][j]);
}
printf("/n");
}
printf("/n");
for( i=0;i<h_size;i++)
{
for(j=0;j<h_size;j++)
{
b[i][j]=a[j][i];
printf("%4.2f ",b[i][j]);
}
printf("/n");
}
printf("/n");
float h_sum=0;
for( i=0;i<h_size;i++)
{
for(j=0;j<h_size;j++)
{
a[i][j]=a[i][j]*a[i][j];
b[i][j]=b[i][j]*b[i][j];
a[i][j]=-(a[i][j]+b[i][j])/(2*sigma*sigma);
a[i][j]=exp(a[i][j]);
if(a[i][j]<0.0001) a[i][j]=0;
h_sum=h_sum+a[i][j];
}
}

for(i=0;i<h_size;i++)
{
for(j=0;j<h_size;j++)
{
a[i][j]=a[i][j]/h_sum;
}
}
for(i=0;i<h_size;i++)
{
for(j=0;j<h_size;j++)
{
printf("%4.4f ",a[i][j]);
}
printf("/n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: