图像缩放的vc代码

数字图像处理中经常要进行图像缩放,改变分辨率,以便于处理和显示。比较好的图像缩放算法是“双线性插值法”。

双线性插值算法描述如下:
  对于一个目的像素,设置坐标通过反向变换得到的浮点坐标为(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
            }
            
        }
    }


文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: vc 图像 缩放 代码 双线性插值
相关日志:
评论: 3 | 引用: 0 | 查看次数: -
回复回复jerome[2010-09-01 01:34 PM | del]
好像不对了,改了下但pSrc没有这么大的空间啊
回复回复小鸟[2010-03-01 11:40 PM | del]
lH lW 是源图像还是目标图像的宽高?
回复来自 admin 的评论 admin 于 2010-03-02 04:11 PM 回复
源图像的宽为(lW * 2 + 1),高为(lH * 2 + 1)
回复回复飞来天香[2009-11-04 02:17 PM | del]
你好,能不能把你完整的代码发一下?lRate是什么?我是新手 但需要这个代码,不知愿不愿分享
回复来自 admin 的评论 admin 于 2009-11-04 04:09 PM 回复
lRate是缩放比例,比如2就是放大一倍。你可以先试试OpenCV,开源的图像处理平台,用cvResize就可以实现图像缩放,网上有例子的。
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.