图像处理之基础---滤波器之高斯低通滤波器3c代码实现yuv,rgb
()高斯理论简介
()
()代码实现
四 使用高斯滤波器进行图像的平滑
()高斯简介
http://research.microsoft.com/en-us/um/people/kahe/eccv10/ 何凯明 matlab 实现
http://www.ruanyifeng.com/blog/2012/11/gaussian_blur.html 阮一峰
http://www.zwbk.org/MyLemmaShow.aspx?lid=126233 中文百科独特解释
http://academic.mu.edu/phys/matthysd/web226/Lab02.htm
http://www.360doc.com/content/12/0921/17/10724725_237428926.shtml 有历程
http://blog.csdn.net/l_inyi/article/details/8915116 实现opencv
http://www.cnblogs.com/JohnShao/archive/2011/06/02/2067800.html 工业级应用
http://blog.csdn.net/zddblog/article/details/7450033 高斯模糊小结
生成高斯核
/*************************************************************************
*
* \函数名称:
* MakeGauss()
*
* \输入参数:
* double sigma - 高斯函数的标准差
* double **pdKernel - 指向高斯数据数组的指针
* int *pnWindowSize - 数据的长度
*
* \返回值:
* 无
*
* \说明:
* 这个函数可以生成一个一维的高斯函数的数字数据,理论上高斯数据的长度应
* 该是无限长的,但是为了计算的简单和速度,实际的高斯数据只能是有限长的
* pnWindowSize就是数据长度
*
*************************************************************************
*/
void MakeGauss(double sigma, double **pdKernel, int *pnWindowSize)
{
// 循环控制变量
int i ;
// 数组的中心点
int nCenter;
// 数组的某一点到中心点的距离
double dDis ;
double PI = 3.14159;
// 中间变量
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;
}
}
高斯滤波
/*************************************************************************
*
* \函数名称:
* GaussianSmooth()
*
* \输入参数:
* unsigned char * pUnchImg - 指向图象数据的指针
* int nWidth - 图象数据宽度
* int nHeight - 图象数据高度
* double dSigma - 高斯函数的标准差
* unsigned char * pUnchSmthdImg - 指向经过平滑之后的图象数据
*
* \返回值:
* 无
*
* \说明:
* 为了抑止噪声,采用高斯滤波对图象进行滤波,滤波先对x方向进行,然后对
* y方向进行。
*
*************************************************************************
*/
void GaussianSmooth(unsigned char *pUnchImg, int nWidth, int nHeight,
double sigma, unsigned char * pUnchSmthdImg)
{
// 循环控制变量
int y;
int x;
int i;
// 高斯滤波器的数组长度
int nWindowSize;
// 窗口长度的1/2
int nHalfLen;
// 一维高斯数据滤波器
double *pdKernel ;
// 高斯系数与图象数据的点乘
double dDotMul ;
// 高斯滤波系数的总和
double dWeightSum ;
// 中间变量
double * pdTmp ;
// 分配内存
pdTmp = new double[nWidth*nHeight];
// 产生一维高斯数据滤波器
// MakeGauss(sigma, &dKernel, &nWindowSize);
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 ;
}
}
// 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] = (unsigned char)(int)dDotMul/dWeightSum ;
}
}
// 释放内存
delete []pdKernel;
pdKernel = NULL ;
delete []pdTmp;
pdTmp = NULL;
}
http://www.cnblogs.com/IamEasy_Man/archive/2010/08/17/1801477.html 纯c实现
void gaussianFilter(uchar* data, int width, int height) |
02 |
{ |
03 |
int i, j, index, sum; |
04 |
int templates[9] = { 1, 2, 1, |
05 |
2, 4, 2, |
06 |
1, 2, 1 }; |
07 |
sum = height * width * sizeof (uchar); |
08 |
uchar *tmpdata = (uchar*) malloc (sum); |
09 |
memcpy (( char *)tmpdata,( char *)data, sum); |
10 |
for (i = 1;i < height - 1;i++) |
11 |
{ |
12 |
for (j = 1;j < width - 1;j++) |
13 |
{ |
14 |
index = sum = 0; |
15 |
for ( int m = i - 1;m < i + 2;m++) |
16 |
{ |
17 |
for ( int n = j - 1; n < j + 2;n++) |
18 |
{ |
19 |
sum += |
20 |
tmpdata[m * width + n] * |
21 |
templates[index++]; |
22 |
} |
23 |
} |
24 |
data[i * width + j] = sum / 16; |
25 |
} |
26 |
} |
27 |
free (tmpdata); |
28 |
} |
一个模板
http://www.360doc.com/content/12/0921/16/10724725_237423041.shtml
//**********************************************************************
//模板操作
//图像信息头
//图像数据
//模板大小 以0开始
//模板中心元素 以0开始
//模板数据
//模板系数
//**********************************************************************
BOOL ImgTemplate(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,CSize TemplateSize,CSize TemplateCertel ,int *template_box,float coef)
{
LONG imagewidth=pbmpinfo->bmiHeader.biWidth;
LONG imageheigth=pbmpinfo->bmiHeader.biHeight;
LONG i=0,j=0,k=0,heigth=0,width=0;
//data is not null
if (pbmpdata == NULL)
{
return FALSE;
}
//image size
if (imageheigth <= TemplateSize.cy || imagewidth <= TemplateSize.cx)
{
return FALSE;
}
if (TemplateCertel.cx < 0 || TemplateCertel.cy < 0 || TemplateCertel.cx > TemplateSize.cx || TemplateCertel.cy > TemplateSize.cy)
{
return FALSE;
}
//color must be gray
if (pbmpinfo->bmiHeader.biBitCount != 8)
{
AfxMessageBox("只对灰度图像进行操作!");
return FALSE;
}
//image size
LONG Linebyte =( pbmpinfo->bmiHeader.biBitCount * imagewidth +31)/32*4;
LONG ImageSize=Linebyte * imageheigth;
//分配空间
BYTE *pNewbmpdata=(BYTE*)malloc(ImageSize);
//copy data
if (pNewbmpdata == NULL)
{
return FALSE;
}
memcpy(pNewbmpdata,pbmpdata,ImageSize);
BYTE *psrc=NULL;
BYTE *pdest=NULL;
LONG result=0;
for (heigth = TemplateCertel.cy ; heigth < imageheigth - TemplateSize.cy + TemplateCertel.cy + 1 ;heigth++ )
{
for ( width = TemplateCertel.cx ; width < imagewidth - TemplateSize.cx + TemplateCertel.cx + 1 ; width++)
{
psrc = (unsigned char *)pbmpdata+(ImageSize-Linebyte-
heigth*Linebyte)+width;
pdest = (unsigned char *)pNewbmpdata+(ImageSize-Linebyte-
heigth*Linebyte)+width;
j=0;
result=0;
for ( i = - TemplateCertel.cy ; i < TemplateSize.cy - TemplateCertel.cy ;i++)
{
for (k = - TemplateCertel.cx ; k < TemplateSize.cx -TemplateCertel.cy ;k++)
{
result += (LONG)(*(psrc + i * Linebyte + k)) * template_box[j++];
}
}
result = (LONG)(result * coef);
if (result>255)
{
result=255;
}
if (result<0)
{
result=0;
}
*pdest=(unsigned char)result;
}
}
memcpy(pbmpdata,pNewbmpdata,ImageSize);
free(pNewbmpdata);
return TRUE;
}
http://www.2cto.com/kf/201306/220419.html 对美女图像的缩小 图像处理之高斯金字塔java
http://blog.csdn.net/fanner01/article/details/6525270 Gaussian Smoothing Filter高斯平滑滤波器
http://blog.csdn.net/zhengtu009/article/details/21862353 滤波器设计,包括相关高斯建模,跟踪!
http://wenku.baidu.com/link?url=Z9F4EUkVxkYIAlbi7cueVEyu-rStz-4tgDvri1MM83F2RPW2vLk-xSQX7pN0lfrZ0ADsMuo6OkEEbBq2Sy4sKYUTntvOhv7r15K8gBUi_-G 基于dm6437的 canny 边缘检测
http://www.google.co.uk/patents/US6046654 高斯专利
http://d.wanfangdata.com.cn/Periodical_gxjs200703024.aspx 一种尺度自适应调整的高斯滤波器设计方法
http://www.cvchina.info/2010/05/07/diving-into-gaussian-filter-implementation/ 高斯函数计算中sigma的确定!!!
http://www.cnblogs.com/JohnShao/archive/2011/06/02/2067800.html 高斯二维转一维
http://www.cnblogs.com/JohnShao/archive/2011/08/24/2151463.html
http://blog.csdn.net/hhygcy/article/details/4329056 c++实现
http://blog.csdn.net/l_inyi/article/details/8915116 opencv 实现
http://www.verydemo.com/demo_c113_i8816.html matlab 实现
http://blog.csdn.net/pyramide/article/details/5588880 高斯卷积4种实现方法
http://www.tudou.com/programs/view/NsvOZtjS1Zo/#http://www.tudou.com/programs/view/BxfgcVCnzk8/ 高斯滤波游戏中的应用魔兽
http://www.geeks3d.com/20100909/shader-library-gaussian-blur-post-processing-filter-in-glsl/ 美女图片3d 效果
http://prideout.net/archive/bloom/ pengl
http://blog.csdn.net/pyramide/article/details/5588979 高斯简介
图像处理之基础---滤波器之高斯低通滤波器3c代码实现yuv,rgb的更多相关文章
- 图像处理之基础---滤波器之高斯低通滤波器的高斯模板生成c实现
()代码实现 对原图进行高斯平滑,去除图像中的计算噪声void Bmp::MakeGauss(double sigma,double **pdKernel,int *pnWindowSize){ // ...
- Atitit 图像处理 平滑 也称 模糊, 归一化块滤波、高斯滤波、中值滤波、双边滤波)
Atitit 图像处理 平滑 也称 模糊, 归一化块滤波.高斯滤波.中值滤波.双边滤波) 是一项简单且使用频率很高的图像处理方法 用途 去噪 去雾 各种线性滤波器对图像进行平滑处理,相关OpenC ...
- 学习 opencv---(7) 线性邻域滤波专场:方框滤波,均值滤波,高斯滤波
本篇文章中,我们一起仔细探讨了OpenCV图像处理技术中比较热门的图像滤波操作.图像滤波系列文章浅墨准备花两次更新的时间来讲,此为上篇,为大家剖析了"方框滤波","均值滤 ...
- 基于MATLAB的中值滤波均值滤波以及高斯滤波的实现
基于MATLAB的中值滤波均值滤波以及高斯滤波的实现 作者:lee神 1. 背景知识 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. 中值滤 ...
- matlab中fspecial Create predefined 2-D filter以及中值滤波均值滤波以及高斯滤波
来源: 1.https://ww2.mathworks.cn/help/images/ref/fspecial.html?searchHighlight=fspecial&s_tid=doc_ ...
- 图像处理之基础---yuv420及其rgb,bayer, yuv, RGB的相互转换详解
YUV格式解析1(播放器——project2) 根据板卡api设计实现yuv420格式的视频播放器 打开*.mp4;*.264类型的文件,实现其播放. 使用的视频格式是YUV420格式 YUV格式 ...
- 图像处理------Mean Shift滤波(边缘保留的低通滤波)
一:Mean Shift算法介绍 Mean Shift是一种聚类算法,在数据挖掘,图像提取,视频对象跟踪中都有应用.本文 重要演示Mean Shift算法来实现图像的低通边缘保留滤波效果.其处理以后的 ...
- JavaBean 基础概念、使用实例及代码分析
JavaBean 基础概念.使用实例及代码分析 JavaBean的概念 JavaBean是一种可重复使用的.且跨平台的软件组件. JavaBean可分为两种:一种是有用户界面的(有UI的):另一种是没 ...
- [置顶] 自己写代码生成器之生成Dal层代码(获取数据库所有表名称)
自己写代码生成器之生成Dal层代码(获取数据库所有表名称) --得到数据库birthday所有表名称 select name from sysobjects where [type]='U' --se ...
随机推荐
- 流行-Manifold【0】-维基百科中文版本解释
- yii1框架,事务使用方法
Yii1框架事务操作方法如下: $transaction= Yii::app()->db->beginTransaction();//创建事务 $transaction->commi ...
- 24L01-2.4G无线传输模块调节记录
在调试24L01的时候,虽然能用到别人的程序,但仅仅是程序的初始化,并没有告诉我们如何去后续的操作,如何去再次发送一组数.最近调试24L01接近尾声,将逐一的地方总结下来,以便以后查阅,也供其他人借鉴 ...
- Vertex&Frag
一.Vertex&Frag 包含Vertex&Fragment 的Shader叫做顶点&像素着色器,在Vertex的功能函数中,我们侧重于几何计算,如纹理坐标,顶点坐标等:在F ...
- Ubuntu中Hadoop环境搭建
Ubuntu中Hadoop环境搭建 JDK安装 方法一:通过命令行直接安装(不建议) 有两种java可以安装oracle-java8-installer以及openjdk (1)安装oracle-ja ...
- Leetcode 212.单词搜索II
单词搜索II 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻&q ...
- 网络编程基础:粘包现象、基于UDP协议的套接字
粘包现象: 如上篇博客中最后的示例,客户端有个 phone.recv(2014) , 当服务端发送给客户端的数据大于1024个字节时, 多于1024的数据就会残留在管道中,下次客户端再给服务端发命令时 ...
- hash存储结构【六】
一.概述: 我们可以将Redis中的Hashes类型看成具有String Key和String Value的map容器.所以该类型非常适合于存储值对象的信息.如Username.Password和Ag ...
- python之模块随笔记-sys
模块名:sys sys.argv 实现从程序外部向程序传递参数 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.modules.keys() 返回所有已经导 ...
- java基础标识符,关键字,常量
1关键字1.1关键字的概述Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名.方法名.类名.包名.2标识符2.1什么是标识符就是程序员 ...