缩放图像的双线性内插法
2011-09-28 19:33
232 查看
今天将图像缩放的双线性内插法弄完了,主要的思想如下:
对于一个目的像素,通过目标图像与源图像的比值进行反向变换得到一个浮点坐标,如fx(x+u,y+v)其中为非负整数,u,v为区间[0,1]上的浮点数。则目的像素的颜色值可以由源图像的点fx(x,y)与其相邻的四个点的颜色值决定。
公式为:fx(x+u,y+v)=(1-u)(1-v)fx(x,y)+(1-u)(v)fx(x,y+1) +(u)(1-v)fx(x+1,y)+uvfx(x+1,y+1);
下面是我自己写的一个缩放图像的函数。
对于一个目的像素,通过目标图像与源图像的比值进行反向变换得到一个浮点坐标,如fx(x+u,y+v)其中为非负整数,u,v为区间[0,1]上的浮点数。则目的像素的颜色值可以由源图像的点fx(x,y)与其相邻的四个点的颜色值决定。
公式为:fx(x+u,y+v)=(1-u)(1-v)fx(x,y)+(1-u)(v)fx(x,y+1) +(u)(1-v)fx(x+1,y)+uvfx(x+1,y+1);
下面是我自己写的一个缩放图像的函数。
void CTestView::Linear_BMP(COLORREF **DesImage,double DesWidth,double DesHeight,COLORREF **SrcImage ,double SrcWidth,double SrcHeight) { if(SrcImage == NULL) return; DesImage=new COLORREF*[(int)DesHeight]; for(int n1=0;n1<DesHeight;n1++) DesImage[n1]=new COLORREF[(int)DesWidth]; double w = (double)SrcWidth/(double)DesWidth;//源/目标=比例 double h = (double)SrcHeight/(double)DesHeight; double u,v; double Sx,Sy; double pm[4]; int tx,ty; int red[4],green[4],blue[4]; double r=0,g=0,b=0; for(int i = 0; i < DesHeight; i++) { Sy = (double)(i) * h; ty = (int)Sy; v = fabs(Sy - ty); for(int j = 0; j<DesWidth; j++) { Sx = (double)(j) * w ; tx = (int)Sx; u = fabs(Sx - tx); pm[0] = ( 1.0 - u ) * ( 1.0 - v ); pm[1] = v * ( 1.0 - u ); pm[2] = u * ( 1.0 - v ); pm[3] = u * v; if(tx>=SrcWidth - 2) tx = SrcWidth - 2; if(ty>=SrcHeight - 2) ty = SrcHeight - 2; red[0] = GetRValue(SrcImage[ty][tx]); red[1] = GetRValue(SrcImage[ty+1][tx]); red[2] = GetRValue(SrcImage[ty][tx+1]); red[3] = GetRValue(SrcImage[ty+1][tx+1]); green[0] = GetGValue(SrcImage[ty][tx]); green[1] = GetGValue(SrcImage[ty+1][tx]); green[2] = GetGValue(SrcImage[ty][tx+1]); green[3] = GetGValue(SrcImage[ty+1][tx+1]); blue[0] = GetBValue(SrcImage[ty][tx]); blue[1] = GetBValue(SrcImage[ty+1][tx]); blue[2] = GetBValue(SrcImage[ty][tx+1]); blue[3] = GetBValue(SrcImage[ty+1][tx+1]); r = 0; g = 0; b = 0; for(int m = 0;m<4;m++) { r += pm[m] * red[m]; g += pm[m] * green[m]; b += pm[m] * blue[m]; } // DesImage[i][j] = pm[0] * SrcImage[ty][tx] + pm[1] * SrcImage[ty][tx+1] + pm[2] * SrcImage[ty+1][tx] + pm[3] * SrcImage[ty+1][tx+1]; // DesImage[i][j] = SrcImage[ty][tx]; DesImage[i][j] = RGB(r,g,b); // DesImage[i][j] = (SrcImage[ty][tx]+SrcImage[ty][tx+1]+ SrcImage[ty+1][tx]+SrcImage[ty+1][tx+1])/4; } } LImage = DesImage; }
相关文章推荐
- [图像]图像缩放算法-双线性内插法
- [图像]图像缩放算法-双线性内插法
- 缩放图像的双线性内插法
- python数字图像处理(7):图像的形变与缩放
- [Android]android.graphics.Camera实现图像的旋转、缩放,配合Matrix实现图像的倾斜
- 【Rayeager PX2分享】OpenCV入门之图像缩放
- Android开发--图形图像与动画(二)--Animation实现图像的 渐变、缩放、位移、旋转
- UIGraphicsBeginImageContext系列知识——缩放图像尺寸,方便上传至服务器
- 【OpenCV入门指南】第二篇 缩放图像
- 为对话框设置背景图像(不考虑图片缩放)
- 在Kentico CMS中使用jQuery集成图像缩放效果
- 图像编程学习笔记7——图像缩放
- Java图片缩略图裁剪水印缩放旋转压缩转格式-Thumbnailator图像处理
- 通过pyrUp和pyrDown实现图像缩放的简单程序
- Go语言中对图像进行缩放
- C# 图像处理(一)(图像缩放、屏幕截取、图像合并、保存图像)
- 【Android】Bitmap显示图像的缩放问题
- 3.使用cvPyrDown()缩放图像(一个复杂一点的变换)
- PHP图像处理函数:文字水印,图片水印,缩略图(等比缩放)
- 数字图像的缩放及opencv中的实现