基本原理:

1、最近邻插值:变换后的目标图像某点像素值等于源图像中与变换前相应点最近的点的像素值。具体操作为,设水平方向和垂直方向缩放的比例分别为w和h,那么目标图像中的点des(x,y)对应的源图像中的点src的坐标为(x0,y0)=(x/w,y/h)。其中,x0,y0可能为小数,故对其四舍五入,即(x0,y0)=int(x0+0.5,y0+0.5),因此点des(x,y)的像素值就是点src(x0,y0)的像素值。

2、双线性插值:由1中最近邻插值中的四舍五入前的点src(x0,y0)得到它的2*2区域4个邻域像素点的坐标,即(x1,y1)=(int(x0),int(y0)),(x1,y2)=int(x1,y1+1),(x2,y1)=(x1+1,y1),(x2,y2)=(x1+1,y1+1),然后计算权重q1=(x0-x1)*(y0-y1),q2=(1.0-(x0-x1))*(y0-y1),q4=(x0-x1)*(1.0-(y0-y1)),q3=(1.0-(x0-x1))*(1.0-(y0-y1),用value(x,y)表示点(x,y)处的像素值,则目标图像中的点des(x,y)对应像素值value(x,y)=value(x2,y2)*q1+value(x1,y2)*q2+value(x1,y1)*q3+value(x2,y1)*q4,

c/c++实现及处理效果:

1、最近邻插值

void GeometryTrans::Zoom(float ratioX, float ratioY)
{//释放旧的输出图像缓冲区if(m_pImgDataOut!=NULL){delete []m_pImgDataOut;m_pImgDataOut=NULL;}//输出图像的宽和高m_imgWidthOut=int(m_imgWidth*ratioX+0.5) ;m_imgHeightOut=int(m_imgHeight*ratioY+0.5); //输入图像每行像素字节数int lineByteIn=(m_imgWidth*m_nBitCount/8+3)/4*4;//输出图像每行像素字节数int  lineByteOut=(m_imgWidthOut*m_nBitCount/8+3)/4*4;//申请缓冲区,存放输出结果m_pImgDataOut=new unsigned char[lineByteOut*m_imgHeightOut];//每像素字节数,输入图像与输出图像相同int pixelByte=m_nBitCount/8;//输出图像在输入图像中待插值的位置坐标int coordinateX, coordinateY;//循环变量,输出图像的坐标int i, j;//循环变量,像素的每个通道int k;//近邻插值for(i=0; i< m_imgHeightOut; i++){for(j=0; j<m_imgWidthOut; j++){  //输出图像坐标为(j,i)的像素映射到原图中的坐标值,即插值位置coordinateX=j/ratioX+0.5;coordinateY=i/ratioY+0.5;//若插值位置在输入图像范围内,则近邻插值if(0<=coordinateX&&coordinateX<m_imgWidth&& coordinateY>=0&&coordinateY<m_imgHeight){for(k=0;k<pixelByte;k++)*(m_pImgDataOut + i * lineByteOut + j*pixelByte + k) =*(m_pImgData+ coordinateY*lineByteIn+ coordinateX*pixelByte + k) ;}else //若不在输入图像范围内,则置255  {for(k=0;k<pixelByte;k++)*(m_pImgDataOut + i * lineByteOut + j*pixelByte+k) = 255;}         }}
}

2、双线性插值

void GeometryTrans::Zoom(float ratioX, float ratioY)
{//释放旧的输出图像缓冲区if(m_pImgDataOut!=NULL){delete []m_pImgDataOut;m_pImgDataOut=NULL;}//输出图像的宽和高m_imgWidthOut=int(m_imgWidth*ratioX+0.5) ;m_imgHeightOut=int(m_imgHeight*ratioY+0.5); //输入图像每行像素字节数int lineByteIn=(m_imgWidth*m_nBitCount/8+3)/4*4;//输出图像每行像素字节数int  lineByteOut=(m_imgWidthOut*m_nBitCount/8+3)/4*4;//申请缓冲区,存放输出结果m_pImgDataOut=new unsigned char[lineByteOut*m_imgHeightOut];//每像素字节数,输入图像与输出图像相同int pixelByte=m_nBitCount/8;//输出图像在输入图像中待插值的位置坐标float coordinateX, coordinateY;//循环变量,输出图像的坐标int i, j;//循环变量,像素的每个通道int k;int y1,y2, x1,x2;float fx1,fx2, fy1, fy2;//双线性插值for(i=0; i< m_imgHeightOut; i++){coordinateY = i/ratioY;y1 = (int)coordinateY;if(y1 == m_imgHeightOut-1)    y2 = y1;else y2 = y1 + 1;fy1 = coordinateY-y1; fy2 = (float)1.0 - fy1;for(j=0; j<m_imgWidthOut; j++){  coordinateX = j/ratioX;x1 = (int)coordinateX;if(x1 == m_imgWidthOut-1)    x2 = x1;else x2 = x1+1;fx1 = coordinateX-x1;fx2 = (float)1.0 - fx1;//所求的源图像中的2*2区域4个邻近象素点坐标为(x1, y1) (x1, y2) (x2, y1) (x2,y2)//计算4个权重float s1 = fx1*fy1;float s2 = fx2*fy1;float s3 = fx2*fy2;float s4 = fx1*fy2;//输出图像坐标为(j,i)的像素映射到原图中的坐标值,即插值位置//若插值位置在输入图像范围内,则双线性插值if(0<=coordinateX&&coordinateX<m_imgWidth&& coordinateY>=0&&coordinateY<m_imgHeight){for(k=0;k<pixelByte;k++)*(m_pImgDataOut + i * lineByteOut + j*pixelByte + k) =(int)((*(m_pImgData+ y2*lineByteIn+ x2*pixelByte + k))*s1+(*(m_pImgData+ y2*lineByteIn+ x1*pixelByte + k))*s2+(*(m_pImgData+ y1*lineByteIn+ x1*pixelByte + k))*s3+(*(m_pImgData+ y1*lineByteIn+ x2*pixelByte + k))*s4);}else //若不在输入图像范围内,则置255  {for(k=0;k<pixelByte;k++)*(m_pImgDataOut + i * lineByteOut + j*pixelByte+k) = 255;}}}}

总结:由处理效果可知,最近邻插值有锯齿现象,灰度值不连续,而双线性插值灰度值连续,图像比较平滑。

转载于:https://blog.51cto.com/51jishurensheng/1866108

数字图像缩放之最近邻插值与双线性插值处理效果对比相关推荐

  1. 【opencv】最近邻插值、双线性插值、双三次插值(三次样条插值)

    目录 1. 最近邻插值 2. 双线性插值 1)简单理解 2)一般性 3. 双三次插值(三次样条插值) 总结 1. 最近邻插值 举个简单例子:一个3×33 \times 33×3 的单通道图像,如下 如 ...

  2. CV笔记2:图像插值算法—最近邻插值、双线性插值

    目录 一. 简介 二.最近邻插值 三.双线性插值 3.1 线性插值 3.2 双线性插值 3.3 双线性插值的加速及优化策略 参考 一. 简介 在图像处理中,平移变换.旋转变换以及放缩变换是一些基础且常 ...

  3. 图像插值算法:最近邻插值、双线性插值

    插值算法:最近邻插值.双线性插值 文章目录 插值算法:最近邻插值.双线性插值 最近邻插值法(nearest_neighbor) 线性插值 单线性插值法 双线性插值 插值算法有很多种,这里列出关联比较密 ...

  4. 最近邻插值、双线性插值、双三次插值

    1.最近邻插值 越是简单的模型越适合用来举例子,我们就举个简单的图像:3X3 的256级灰度图,也就是高为3个象素,宽也是3个象素的图像,每个象素的取值可以是 0-255,代表该像素的亮度,255代表 ...

  5. 最近邻插值与双线性插值

    最近邻插值 顾名思义,最近邻插值法在放大图像时补充的像素是最近邻的像素的值.由于方法简单,所以处理速度很快,但是得到的图像常常含有锯齿边缘.如下图所示: import cv2 import numpy ...

  6. 图像常用的插值算法:最近邻插值、双线性插值和双三次插值算法

    图像常用的插值算法 最近邻插值算法 双线性插值算法 双三次插值(bicubic)算法 三种插值算法的优缺点 插值算法是图像缩放中的一项基本且重要的算法:在图像缩放中,输出图像像素点坐标可能对应输入图像 ...

  7. CImage实现双缓冲最近邻插值

     一普通显示:现在的VC显示图片非常方便,远不是VC6.0那个年代的技术可比,而且支持多种格式的如JPG,PNG. CImage _img; 初始化: _img.Load(L"map.p ...

  8. 数字图像处理笔记二 - 图片缩放(最近邻插值(Nearest Neighbor interpolation))

    图片缩放的两种常见算法: 最近邻域内插法(Nearest Neighbor interpolation) 双向性内插法(bilinear interpolation) 本文主要讲述最近邻插值(Near ...

  9. 计算机图形学代码放大缩小,当今主流数字图像缩放技术的算法

    1.Ferguson双三次曲面 给定双三次参数曲面 4个角点处的几何信息:位置矢量 (i,j=0,1),沿 向的切矢 ,以及四个角点处的扭矢 ,则满足以上几何条件的双三次曲面可表示为: (4.1) 其 ...

最新文章

  1. 如何更改 Linux/Unix 登录账号的密码
  2. 给我十分钟带你过完java多线程所有基础知识
  3. 最大权闭合子图(最小割)
  4. Spring 钩子之BeanFactoryPostProcessor和BeanPostProcessor
  5. 高等数学上-赵立军-北京大学出版社-题解-练习2.7
  6. flask 接口 让别人能访问_flask搭建一个前后端分离的系统
  7. 【转】ABP源码分析二十二:Navigation
  8. 和为 k 的组合(51Nod-1268)
  9. 中的挂起是什么意思_仪表板亮奇怪指示灯,乌龟晒太阳是什么意思?老司机:不懂别上路...
  10. MyBatis Invalid bound statement (not found)问题 -- 记一次与空气的斗智斗勇
  11. javascript小技巧 JavaScript[对象.属性]集锦 [zz]
  12. Eclipse-Git
  13. OSPFv3中LSA详解(八)——Type5类LSA详解
  14. ASP.NET AJAX客户端编程之旅(一)——Hello!ASP.NET AJAX
  15. simotion基本功能手册_深入浅出西门子运动控制器——SIMOTION实用手册(1CD)
  16. 用计算机用两个珠子能拨出那些数字,人教版一年级数学上册第三单元教案
  17. 类似123321特殊数的输出
  18. 搜狗推送工具之泛站程序实现泛收录
  19. 外卖返利微信小程序源码
  20. axios封装需要注意的增删改查传参易混淆点

热门文章

  1. 菜鸟学PHP之Smarty入门(组图)
  2. LINQ via C# 系列文章
  3. 古典加密算法-----置换密码
  4. PostgreSQL入门,PostgreSQL和mysql
  5. 关于异常的处理的总结
  6. CentOS 7 的初始化
  7. Freebsd10上部署open*** 服务器
  8. 基于纯 CSS3 技术实现美观的标签云效果
  9. cocos2dx 自学记录(4)-- 写一个自己的界面
  10. VMWare虚拟机网络连接