当前位置: 代码迷 >> 其他开发语言 >> 请问关于matlab中imfilter函数的使用
  详细解决方案

请问关于matlab中imfilter函数的使用

热度:152   发布时间:2016-05-02 03:59:51.0
请教关于matlab中imfilter函数的使用
imfilter是一个滤波函数,我想请教它具体的实现过程是怎么样的,具体如下面的例子,过程是怎么样的,为什么会得到这样的结果?如果想用C语言实现应该怎么做?灰常感谢!

------解决方案--------------------
引用:
Quote: 引用:

卷积运算,你应该好好学习信号与系统

图像处理函数详解——imfilter
功能:对任意类型数组或多维图像进行滤波。
用法:B = imfilter(A,H)
   B = imfilter(A,H,option1,option2,...)
   或写作g = imfilter(f, w, filtering_mode, boundary_options, size_options)
其中,f为输入图像,w为滤波掩模,g为滤波后图像。filtering_mode用于指定在滤波过程中是使用“相关”还是“卷积”。boundary_options用于处理边界充零问题,边界的大小由滤波器的大小确定。具体参数选项见下表:
选项 描述
filtering_mode ‘corr’ 通过使用相关来完成,该值为默认。
‘conv’ 通过使用卷积来完成
boundary_options ‘X’ 输入图像的边界通过用值X(无引号)来填充扩展
其默认值为0
‘replicate’ 图像大小通过复制外边界的值来扩展
‘symmetric’ 图像大小通过镜像反射其边界来扩展
‘circular’ 图像大小通过将图像看成是一个二维周期函数的一个周期来扩展
size_options ‘full’ 输出图像的大小与被扩展图像的大小相同
‘same’ 输出图像的大小与输入图像的大小相同。这可通过将滤波掩模的中心点的偏移限制到原图像中包含的点来实现,该值为默认值。

举例:originalRGB = imread('peppers.png');
imshow(originalRGB)
h = fspecial('motion', 50, 45);%创建一个滤波器
filteredRGB = imfilter(originalRGB, h);
figure, imshow(filteredRGB)

很高兴再次见到你,你说这些我懂,我想知道的是详细的运算过程

就是用模板对中心像素周围的矩阵做一个卷积


------解决方案--------------------
 在进行图像目标识别与跟踪时,摄像机所采集的图像,在成像、数字化以及传输过程中,难免会受到各种各样噪声的干扰,图像的质量往往会出现不尽人意的退化,影响了图像的视觉效果。通常这些噪声干扰使得图像退化,表现为图像模糊,特征淹没,这会对图像分析产生不利,使所获得的图像质量较低。对这样的图像直接进行目标的识别与跟踪是比较困难的。抑制使图像退化的各种干扰信号、增强图像中的有用信号,以及将观测到的不同图像在同一约束条件下进行校正处理就显得非常重要。本文主要对图像预处理过程中的滤波方法进行总结,阐述滤波原理,在VC下基于OpenCV实现各种算法,并给出各种滤波的效果。

1、高斯滤波

      高斯滤波是一种线性平滑滤波,适用于滤除高斯白噪声,已广泛应用于图像处理的预处理阶段。按照本人的理解,对图像进行高斯滤波就是对图像中的每个点的像素值计算,计算的准则是,由该点本身灰度值以及其邻域内的其他像素灰度值加权平均所得,而加权平均的权系数由二维离散高斯函数采样并归一化后所得。具体的高斯函数及其离散化参考《高斯图像滤波原理及其编程离散化实现方法》一文。以下给出图像高斯滤波的实现代码。


void GuassFilter(CvMat *pGrayMat, CvMat* pFilterMat, int nWidth, int nHeight, double dSigma)
{
////////////////////////参数说明///////////////////////////////////
//pGrayMat:待处理图像数组
//pFilterMat:保存高斯滤波结果
//nWidth:图像宽度
//nHeight:图像高度
//dSigma:高斯滤波参数,方差
int nWidowSize = (int)(1+2*ceil(3*dSigma));  //定义滤波窗口的大小
int nCenter = (nWidowSize)/2;                //定义滤波窗口中心的索引
//生成二维的高斯滤波系数
double* pdKernal = new double[nWidowSize*nWidowSize]; //定义一维高斯核数组
double  dSum = 0.0;                                   //求和,进行归一化
/////////////二维高斯函数公式//////////////////////     
//                          x*x+y*y        ///////
//                    -1*-------------- ///////
//          1               2*Sigma*Sigma ///////
//   ---------------- e ///////
//   2*pi*Sigma*Sigma ///////
///////////////////////////////////////////////////
for(int i=0; i<nWidowSize; i++)
{
for(int j=0; j<nWidowSize; j++)
{
int nDis_x = i-nCenter;
int nDis_y = j-nCenter;
pdKernal[i+j*nWidowSize]=exp(-(1/2)*(nDis_x*nDis_x+nDis_y*nDis_y)
/(dSigma*dSigma))/(2*3.1415926*dSigma*dSigma);
dSum += pdKernal[i+j*nWidowSize];
}
}
//进行归一化
for(i=0; i<nWidowSize; i++)
{
for(int j=0; j<nWidowSize; j++)
{
pdKernal[i+j*nWidowSize] /= dSum;
}
}
for(i=0; i<nHeight; i++)
{
for(int j=0; j<nWidth; j++)
{
double dFilter=0.0;
double dSum = 0.0;
for(int x=(-nCenter); x<=nCenter; x++) //行
{
for(int y=(-nCenter); y<=nCenter; y++) //列
{
if( (j+x)>=0 && (j+x)<nWidth && (i+y)>=0 && (i+y)<nHeight) //判断边缘
{
double ImageData = cvmGet(pGrayMat ,i+y, j+x);
dFilter += ImageData * pdKernal[(y+nCenter)*nWidowSize+(x+nCenter)];
dSum += pdKernal[(y+nCenter)*nWidowSize+(x+nCenter)];
}
}
}
cvmSet(pFilterMat, i, j, dFilter/dSum);
}
}
delete[]pdKernal;
}
2、均值滤波

       均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度值g(x,y),即g(x,y)=1/m ∑f(x,y), m为该模板中包含当前像素在内的像素总个数。这样的方法可以平滑图像,速度快,算法简单。但是无法去掉噪声,这能微弱的减弱它。其实现代码如下。

void MeanFilter(CvMat *pGrayMat, CvMat *pFilterMat, int nWidth, int nHeight, int nWindows)
{
////////////////////////参数说明///////////////////////////////////
  相关解决方案