李现路:DSP6000图像位置移动与变形的典型算法(三)
三、图像的水平镜像变换算法
数学表达式原理:
设图像高度为IHeight,宽度为IWidth,原图中(x0,y0)经过水平镜像后从未将变为
(IWidth-x0,y0),其表达式为:
X0=IWidth-y1; y0=y1
算法的C语言代码:
/*水平镜像变换处理*/
void horizTranspose()
{
int i,j;
for(i=0;i<numLines;i++)
{
/*前半部分为原始图像*/
//传送临时Y缓冲区
DAT_copy((void *)(capYbuffer + i * numPixels),
(void *)(tempYbuffer + i * numPixels),
numPixels>>1);
//传送临时Cb缓冲区
DAT_copy((void *)(capCbbuffer + i * (numPixels >> 1)),
(void *)(tempCbbuffer + i * (numPixels >> 1)),
numPixels>>2);
//传送临时Cr缓冲区
DAT_copy((void *)(capCrbuffer + i * (numPixels >> 1)),
(void *)(tempCrbuffer + i * (numPixels >> 1)),
numPixels>>2);
/*后半部分为水平镜像图像*/
for(j=numPixels/2;j<numPixels;j++)
{
//传送临时Y缓冲区
*(Uint8 *)(tempYbuffer + i*numPixels + j) = *(Uint8 *)(capYbuffer + i*numPixels + numPixels-1-j);
}
for(j=(numPixels>>2);j<(numPixels>>1);j++)
{
//传送临时Cb缓冲区
*(Uint8 *)(tempCbbuffer + i*(numPixels>>1) + j) = *(Uint8 *)(capCbbuffer + i*(numPixels>>1) + (numPixels>>1)-1-j);
//传送临时Cr缓冲区
*(Uint8 *)(tempCrbuffer + i*(numPixels>>1) + j) = *(Uint8 *)(capCrbuffer + i*(numPixels>>1) + (numPixels>>1)-1-j);
}
}
}
四、图像的缩放算法
数学表达式原理:
假设图像x轴方向缩放比率fx,y轴方向缩放比率是fy,那么原图中点(x0,y0)对应
于新图中的点(x1,y1)的转换表达式为:
X0=x1/fx; y0=y1/fy
算法的C语言代码:
/*图像缩放参数*/
Float fXZoomRatio=0.5; //水平缩放比率
Float fYZoomRatio=0.5; //垂直缩放比率
/*缩放处理函数*/
/*缩放处理*/
void zoom()
{
int i,j;
int intCapX,intCapY;
for(i=0;i<numLines;i++)
{
for(j=0;j<numPixels;j++)
{
intCapX = (int)(j/fYZoomRatio+0.5);
intCapY = (int)(i/fXZoomRatio+0.5);
//判断是否在原图范围内
if((intCapX>=0) && (intCapX<numPixels))
{
if((i<numLines/2) && (intCapY>=0) && (intCapY<numLines/2))
{
//传送亮度信号
*(Uint8 *)(tempYbuffer + i*numPixels + j) = *(Uint8 *)(capYbuffer + intCapY*numPixels + intCapX);
}
else if((i>=numLines/2) && (i<numLines) && (intCapY>=numLines/2) && (intCapY<numLines))
{
//传送亮度信号
*(Uint8 *)(tempYbuffer + i*numPixels + j) = *(Uint8 *)(capYbuffer + intCapY*numPixels + intCapX);
}
else
{
*(Uint8 *)(tempYbuffer + i*numPixels + j) = 0xFF;
}
}
else
{
*(Uint8 *)(tempYbuffer + i*numPixels + j) = 0xFF;
}
}
}
}
[此贴子已经被作者于2009-12-3 13:54:26编辑过]