图像处理之基础---滤波器之高斯低通滤波器的高斯模板生成c实现
()代码实现
对原图进行高斯平滑,去除图像中的计算噪声
void Bmp::MakeGauss(double sigma,double **pdKernel,int *pnWindowSize){
//循环控制变量
int i;
//数组的中心点
int nCenter;
//数组的某一点到中心点的距离
double dDis;
//中间变量
double dValue;
double dSum;
dSum = 0;
//数组长度,根据概率论的知识,选取[-3*sigma,3*sigma]以内的数据
//这些数据会覆盖绝大部分的滤波系数
*pnWindowSize = 1 + 2*ceil(3*sigma);
//中心
nCenter = (*pnWindowSize)/2;
//分配内存
*pdKernel = new double[*pnWindowSize];
//生成高斯数据
for ( i =0;i<(*pnWindowSize);i++)
{
dDis = (double)(i-nCenter);
dValue = exp(-(1/2)*dDis*dDis/(sigma*sigma))/(sqrt(2*PI)*sigma);
(*pdKernel)[i]=dValue;
dSum+=dValue;
}
//归一化
for (i = 0;i<(*pnWindowSize);i++)
{
(*pdKernel)[i]/=dSum;
}
}
void Bmp::GaussianSmooth(u8_t *pUnchImg,int nWidth,int nHeight,double sigma,u8_t *pUnchSmthdImg){
//循环变量
int y,x,i;
//高斯滤波器的数组长度
int nWindowSize;
//窗口长度的1/2
int nHalfLen;
//一维高斯数据滤波器
double *pdKernel;
//高斯系数与图像数据的点乘
double dDotMul;
//高斯滤波系数的总和
double dWeightSum;
//中间变量
double *pdTmp;
//分配内存
pdTmp = new double[nWidth*nHeight];
//产生一维高斯数据滤波器
MakeGauss(sigma,&pdKernel,&nWindowSize);
//MakeGauss返回窗口的长度,利用此变量计算窗口的半长
nHalfLen = nWindowSize/2;
//x方向进行滤波
for (y=0;y<nHeight;y++)
{
for (x=0;x<nWidth;x++)
{
dDotMul = 0;
dWeightSum = 0;
for (i=(-nHalfLen);i<=nHalfLen;i++)
{
//判断是否在图像内部
if ((i+x)>=0 && (i+x)<nWidth)
{
//利用高斯系数对图像数据滤波
dDotMul += (double)pUnchImg[y*nWidth + (i+x)] * pdKernel[nHalfLen+i];
dWeightSum += pdKernel[nHalfLen + i];
}
}
pdTmp[y*nWidth+x]=dDotMul/dWeightSum;
//pUnchSmthdImg[y*nWidth+x]=(u8_t)(int)dDotMul/dWeightSum;
}//end for x
}//end for y
//y方向进行滤波
for (x=0;x<nWidth;x++)
{
for (y=0;y<nHeight;y++)
{
dDotMul = 0;
dWeightSum = 0;
for (i=(-nHalfLen);i<=nHalfLen;i++)
{
//判断是否在图像内部
if ((i+y)>=0 && (i+y)<nHeight)
{
//利用高斯系数对图像数据滤波
dDotMul += (double)pdTmp[(y+i)*nWidth + x] * pdKernel[nHalfLen+i];
dWeightSum += pdKernel[nHalfLen + i];
}
}
pUnchSmthdImg[y*nWidth+x]=(u8_t)(int)dDotMul/dWeightSum;
}//end for y
}//end for x
//释放内存
delete[]pdKernel;
pdKernel = NULL;
delete[]pdTmp;
pdTmp = NULL;
}
main(){
u8_t **new_temp_data;
u8_t *new_temp;
u32_t width,height;
width = bmp_head->img_head->width;
height = bmp_head->img_head->height;
new_temp_data = (u8_t **)malloc((u32_t)width*height);
memset(new_temp_data,(u8_t)255,(u32_t)width*height);
new_temp = (u8_t *)new_temp_data;
memcpy(new_temp_data,bmp_head->buf,(u32_t)width*height);
GaussianSmooth((u8_t *)bmp_head->buf,width,height,0.05,new_temp);
bmp_head->buf = new_temp_data;
}
http://blog.csdn.net/yang1994/article/details/1492815 高斯完整调用
()产生理论
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;
}
}
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");
}
}
http://blog.sina.com.cn/s/blog_71fa0df50100wodv.html
()高斯滤波器参数的确定
http://tsindahui.blog.sohu.com/166075850.html
opencv的实现,在cvFilter.cpp的init_gaussian_kernel函数中:
sigmaX = sigma > 0 ? sigma : (n/2 – 1)*0.3 + 0.8;
彩色图像的高斯平滑处理
()图文说明
http://www.ruanyifeng.com/blog/2012/11/gaussian_blur.html
()维基百科和中文百科
http://en.wikipedia.org/wiki/Convolution
http://www.zwbk.org/MyLemmaShow.aspx?lid=126233
()二维优化
http://www.cnblogs.com/easymind223/archive/2012/11/13/2768680.html
http://blog.csdn.net/lanbing510/article/details/28696833
图像处理之基础---滤波器之高斯低通滤波器的高斯模板生成c实现的更多相关文章
- 图像处理之基础---滤波器之高斯低通滤波器3c代码实现yuv,rgb
()高斯理论简介 () ()代码实现 四 使用高斯滤波器进行图像的平滑 ()高斯简介 http://research.microsoft.com/en-us/um/people/kahe/eccv10 ...
- Django基础三之路由、视图、模板
Django基础三之路由.视图.模板 目录 Django基础三之路由.视图.模板 1. Django 请求和返回周期 1.1 路由层之路由匹配 1.2 有名分组 1.3 无名分组 2. 反射解析 3. ...
- OpenCV探索之路(二):图像处理的基础知识点串烧
opencv图像初始化操作 #include<opencv2\opencv.hpp> #include<opencv2\highgui\highgui.hpp> using n ...
- matlab数字图像处理 入门基础
本代码基于张铮主编的<数字图像处理与机器视觉>一书. 源图片:lena A = imread ('lena.jpg'); %读入图像lena.jpg,赋给变量A %imwrite(A,'l ...
- 机器学习进阶-阈值与平滑-图像平滑操作(去噪操作) 1. cv2.blur(均值滤波) 2.cv2.boxfilter(方框滤波) 3. cv2.Guassiannblur(进行高斯滤波) 4. cv2.medianBlur(进行中值滤波)
1.cv2.blur(img, (3, 3)) 进行均值滤波 参数说明:img表示输入的图片, (3, 3) 表示进行均值滤波的方框大小 2. cv2.boxfilter(img, -1, (3, ...
- 图像处理之基础---彩色转灰度算法优化rgb to yuv
File: StudyRGB2Gray.txtName: 彩色转灰度算法彻底学习Author: zyl910Version: V1.0Updata: 2006-5- ...
- 图像处理之基础---yuv420及其rgb,bayer, yuv, RGB的相互转换详解
YUV格式解析1(播放器——project2) 根据板卡api设计实现yuv420格式的视频播放器 打开*.mp4;*.264类型的文件,实现其播放. 使用的视频格式是YUV420格式 YUV格式 ...
- Matlab图像处理——中值滤波medfilt2问题解决
本文链接:https://blog.csdn.net/Pxzly1117/article/details/79201772程序: I=imread('13.jpg');%读入图像imshow(I);h ...
- 图像处理------Mean Shift滤波(边缘保留的低通滤波)
一:Mean Shift算法介绍 Mean Shift是一种聚类算法,在数据挖掘,图像提取,视频对象跟踪中都有应用.本文 重要演示Mean Shift算法来实现图像的低通边缘保留滤波效果.其处理以后的 ...
随机推荐
- MFC中调用Windows API函数的方式
windows aoi 函数的调用前面加::
- js编码处理(转)
1. 使用 JS 中的 encodeURIComponent 或 encodeURI 方法. 说明: encodeURIComponent(String) 对传递参数进行设置.不编码字符有 ...
- hibernate5.3版本出现hibernate中The server time zone value“乱码”问题的解决办法。
<!-- 配置关于数据库连接的四个项 driverClass url username password --> <property name="hibernate.con ...
- Myeclipse下载
地址:http://www.jb51.net/softs/593889.html#download
- 洛谷——P1602 Sramoc问题
P1602 Sramoc问题 $bfs$搜索 保证第一个搜到的符合条件的就是最小的 #include<bits/stdc++.h> #define N 110000 using names ...
- 笔试算法题(35):最长递增子序列 & 判定一个字符串是否可由另一个字符串旋转得到
出题:求数组中最长递增子序列的长度(递增子序列的元素可以不相连): 分析: 解法1:应用DP之前需要确定当前问题是否具有无后效性,也就是每个状态都是对之前状态的一个总结,之后的状态仅会受到前一个状态的 ...
- 关于统一代码规范ResultBean<T>
之前看了一篇文章,是java团长的一篇代码规范的文章,很有启发.统一返回格式确实给开发带来方便和美感, 有时候Colltroller返回String或者什么Map,list什么的,虽然都转成json返 ...
- 【thinking in java】ArrayList源码分析
简介 ArrayList底层是数组实现的,可以自增扩容的数组,此外它是非线程安全的,一般多用于单线程环境下(Vector是线程安全的,所以ArrayList 性能相对Vector 会好些) Array ...
- 使用ajax解析后台json数据时:Unexpected token o in JSON at position 1
json数据解析异常 今天在做json数据的时候,出现了如下错误,说是解析异常. VM1584:1 Uncaught SyntaxError: Unexpected token o in JSON a ...
- wepy.request 请求成功但是不进入success和fail方法,及请求传参问题
1.根据wepy官方给的文档如下,用then拿后台返回的数据,如果用then报错,请先在app.wpy中配置promise. 没有success,fail,complete方法,如若用了也是不会进入方 ...