您的位置:首页 > 编程语言 > C语言/C++

第一节--滤波操作的VC++实现

2016-03-07 16:41 274 查看
//-----------------------------------------【滤波操作的VC++实现】--------------------------------------

//1--下面为CImgProcess类添加用于--线性滤波的模板操作,函数Template类似于Matlab中的imfilter方法,它支持任意

// 大小的模板,它支持任意大小的模板(nTempH*nTempW)并且提供了更大的模板设定的自由度

//2--模板的中心--可以由参数int nTempMX和nTempMY任意指定

//3--参数FLOAT *pfArray为指向模板数组的指针,而参数FLOAT fCoef为模板的系数-即例子5.1中的1/9

//4--尽管模板本身是一个二维数组,但是程序实现中,我们将它按行存储作为一个一位数组对待,引用起来同样十分方便,

// 如pfArray[k*nTempW+L]表示模板的第K行的第L个元素

//5--Template函数在一开始就将目标图像初始化为黑色,并且,并且没有填充图像的边界,才有5.2.2小结中,提到的第一种

// 收缩边界的策略,因此,经过函数Template滤波的输出图像的周围都有很细的一圈黑边,如图5.6(f)所示。对于3*3的

// 模板,黑边的宽度为1个像素

//------------------------------------------------------------------------------------------------------

/*******************************************************************************************************

*函数原型--void CImgProcess::Template(CImgProcess* pTo,int nTempH,int nTempW,int nTempMY,int nTempMX,

* FLOAT* pfArray,FLOAT fCoef)

*函数功能:模板操作--该函数用于指定模板的大小(任意大小)来对图像进行操作

*函数参数:1--CImgProcess* pTo---输出图像的CImgProcess指针

* 2--int nTempH---模板的高度

* 3--int nTempW---模板的宽度

* 4--int nTempMY---模板中心元素的Y坐标(<=iTempH-1)

* 5--int nTempMX---模板中心元素的X坐标(<=iTempW-1)

* 6--FLOAT* pfArray--指向模板数组的指针

* 7--FLOAT fCoef-----模板系数

*函数返回值:无

********************************************************************************************************/

//1--GetHeight()--返回CImg实例中的图像每列的像素数目,即纵向分辨率或高度

//2--GetGray()----返回指定坐标位置像素的灰度值

//3--SetPixel()设定指定坐标位置像素的颜色值

void CImgProcess::Template(CImgProcess *pTo,int nTempH,int nTempW,int nTempMY,int nTempMX,

FLOAT *pfArray,FLOAT fCoef)

{

//目标图像的初始化

pTo->InitPixels(0);

//循环变量

int i,j;

//扫描图像进行模板操作

for(i=nTempMY;i<GetHeight()-(nTempH-nTempMY)+1;i++)//高度--相当于先行扫描行,一行一行的进行扫描

{

for(j=nTempMX;j<GetWidthPixel()-(nTempW-nTempMX);j++)//宽度--相当于列扫描

{

//(j,i为中心点)

float fResult=0;

for(int k=0;k<nTempH;k++)

{

for(int l=0;l<nTempW;l++)

{

//计算加权和

fResult+=GetGray(j+1-nTempMX,i+k-nTempMX)*pfArray[k*nTempW+1];//此块计算出来的相当于----梯度幅值

}

}

//乘以系数

fResult*=fCoef;

//取正

//fabs()---取一个数的绝对值---#include<math,h>

fResult=(float)fabs(fResult);//锐化时,可能出现负值

BYTE byte;

if(fResult>255)

byte=255;

else

byte=fResult+0.5;//四舍五入

pTo->SetPixel(j,i,RGB(byte,byte,byte));//因此,最后输出的图像是一个---灰度值范围为0~255的灰度图

}//for j

}//for i

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: