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

来源:互联网 发布:java任务调度框架 编辑:程序博客网 时间:2024/05/19 20:42
//-----------------------------------------【滤波操作的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
}
0 0
原创粉丝点击