现在的位置: 首页 > 综合 > 正文

运动模糊实现(VC++)

2013年08月07日 ⁄ 综合 ⁄ 共 1254字 ⁄ 字号 评论关闭

bool MotionBlur(IplImage* src)
{
// 指向目标图像的指针
unsigned char * LPsrc;

//图象的宽度和高度
int   Width = src->width;
int   Height= src->height;

int   LineBytes=src->width*src->nChannels;


int iColumn, jRow;//循环变量

int temp,m;//临时变量

double p,q;// 临时变量

int nTotTime, nTotLen, nTime;

nTotTime = 10;//总的运动时间10s
nTotLen = 10;// 总的运动距离10个象素点

double B;// 摄像机的暴光系数
B = 0.1;


int *nImageDegener;//用来存储源图象和变换核的时域数据

nImageDegener = new int [Height*LineBytes];// 为时域和频域的数组分配空间

// 将数据存入时域数组
for (jRow = 0; jRow < Height; jRow++)
{
for(iColumn = 0; iColumn < LineBytes; iColumn++)
{
temp=0;

// 指向源图像倒数第jRow行,第iColumn个象素的指针

LPsrc = (unsigned char *)src->imageData + LineBytes * jRow + iColumn;

// 象素点的象素值积累
for ( nTime = 0; nTime < nTotTime; nTime++ )
{
p = (float)iColumn - (float)(nTotLen)*nTime/nTotTime;

if (p > 0)
{
q = p - floor((double)p);

if(q >= 0.5)
m = (int)ceil((double)p);
else
m = (int)floor((double)p);

// 累加
LPsrc = (unsigned char *)src->imageData + LineBytes * jRow + m;
temp = temp + *LPsrc;
}
}

// 乘以摄像机的暴光系数
temp = B * temp;
temp=(int)ceil((double)temp);

// 使得temp的取值符合取值范围
if(temp<0)
temp=0;

if(temp>255)
temp=255;

nImageDegener[LineBytes*jRow + iColumn] = temp;
}
}

//转换为图像
for (jRow = 0;jRow < Height ;jRow++)
{
for(iColumn = 0;iColumn < LineBytes ;iColumn++)
{
// 指向源图像倒数第jRow行,第iColumn个象素的指针

LPsrc = (unsigned char *)src->imageData + LineBytes * jRow + iColumn;

*LPsrc = nImageDegener[LineBytes*jRow + iColumn];
}
}

//释放存储空间
delete[] nImageDegener;

// 返回
return true;
}

抱歉!评论已关闭.