高斯
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(自己实现的)
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"); } }
相关文章推荐
- 通过UserAgent判断微信
- java系统学习(十六) --------JDBC及其应用
- 老男孩解决vmware克隆Centos6.4虚拟机网卡无法启动问题
- java系统学习(十六) --------JDBC及其应用
- ACE_Service_Handler类的理解和使用
- 在线技术教程和例子入门
- java 线程创建时间
- css 图片/元素旋转代码
- vim插件的使用
- mutt msmtp
- oracle oracle中ORA-00923: 未找到要求的 FROM 关键字
- ghost click in mobile browser
- matlab 将dcm文件转换为raw
- ELKStack服务管理
- iOS开发UI篇—懒加载
- 算法——最长递增子序列
- 1020. Tree Traversals
- 替换ADT默认的debug.keystore
- 如何理解javascript closure ?
- *第八周*数据结构实践项目二【建设链串算法库】