图像缩放的vc代码
作者:cnfgg 日期:2009-07-14
双线性插值算法描述如下:
对于一个目的像素,设置坐标通过反向变换得到的浮点坐标为(i+u,j+v) (其中i、j均为浮点坐标的整数部分,u、v为浮点坐标的小数部分,是取值[0,1)区间的浮点数),则这个像素得值 f(i+u,j+v) 可由原图像中坐标为 (i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)所对应的周围四个像素的值决定,即:
f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1)
其中f(i,j)表示源图像(i,j)处的的像素值,以此类推。
下面是图像缩放的vc代码,其中图像格式是RGB24,输入图像为pSrc,输出图像为pDst,lRate为放大比例:
复制内容到剪贴板
程序代码
程序代码for(i = 0; i < (lH * 2 + 1) * lRate; i++)
{
for(j = 0; j < (lW * 2 + 1) * lRate; j++)
{
float fX = float(j) / lRate;
float fY = float(i) / lRate;
int iStepSrc = lW * 2 + 1;
int iStepDst = (lW * 2 + 1) * lRate;
int iX = (int)fX;
int iY = (int)fY;
BYTE bUpLeft, bUpRight, bDownLeft, bDownRight;
BYTE gUpLeft, gUpRight, gDownLeft, gDownRight;
BYTE rUpLeft, rUpRight, rDownLeft, rDownRight;
BYTE b,g,r;
bUpLeft = pSrc[iY * iStepSrc * 3 + iX * 3 + 0];
bUpRight = pSrc[iY * iStepSrc * 3 + (iX + 1) * 3 + 0];
bDownLeft = pSrc[(iY + 1) * iStepSrc * 3 + iX * 3 + 0];
bDownRight = pSrc[(iY + 1) * iStepSrc * 3 + (iX + 1) * 3 + 0];
gUpLeft = pSrc[iY * iStepSrc * 3 + iX * 3 + 1];
gUpRight = pSrc[iY * iStepSrc * 3 + (iX + 1) * 3 + 1];
gDownLeft = pSrc[(iY + 1) * iStepSrc * 3 + iX * 3 + 1];
gDownRight = pSrc[(iY + 1) * iStepSrc * 3 + (iX + 1) * 3 + 1];
rUpLeft = pSrc[iY * iStepSrc * 3 + iX * 3 + 2];
rUpRight = pSrc[iY * iStepSrc * 3 + (iX + 1) * 3 + 2];
rDownLeft = pSrc[(iY + 1) * iStepSrc * 3 + iX * 3 + 2];
rDownRight = pSrc[(iY + 1) * iStepSrc * 3 + (iX + 1) * 3 + 2];
b = bUpLeft * (iX + 1 - fX) * (iY + 1 - fY) + bUpRight * (fX - iX) * (iY + 1 - fY)
+ bDownLeft * (iX + 1 - fX) * (fY - iY) + bDownRight * (fX - iX) * (fY - iY);
g = gUpLeft * (iX + 1 - fX) * (iY + 1 - fY) + gUpRight * (fX - iX) * (iY + 1 - fY)
+ gDownLeft * (iX + 1 - fX) * (fY - iY) + gDownRight * (fX - iX) * (fY - iY);
r = rUpLeft * (iX + 1 - fX) * (iY + 1 - fY) + rUpRight * (fX - iX) * (iY + 1 - fY)
+ rDownLeft * (iX + 1 - fX) * (fY - iY) + rDownRight * (fX - iX) * (fY - iY);
if(iY >= 0 && iY <= lH * 2 && iX >= 0 && iX <= lW * 2)
{
pDst[i * iStepDst * 3 + j * 3 + 0] = b; //B
pDst[i * iStepDst * 3 + j * 3 + 1] = g; //G
pDst[i * iStepDst * 3 + j * 3 + 2] = r; //R
}
}
}
评论: 3 | 引用: 0 | 查看次数: -
回复
]好像不对了,改了下但pSrc没有这么大的空间啊
lH lW 是源图像还是目标图像的宽高?
admin 于 回复
源图像的宽为(lW * 2 + 1),高为(lH * 2 + 1)
你好,能不能把你完整的代码发一下?lRate是什么?我是新手 但需要这个代码,不知愿不愿分享
admin 于 回复
lRate是缩放比例,比如2就是放大一倍。你可以先试试OpenCV,开源的图像处理平台,用cvResize就可以实现图像缩放,网上有例子的。
发表评论
上一篇
下一篇

文章来自:
Tags:
相关日志: