双线性插值原理与实现
来源:互联网 发布:ipad苹果园软件下载 编辑:程序博客网 时间:2024/06/05 04:16
B(x,y) = A(x/4,y/4) (式1)
对于B中的(4,4),(4,8),(4,16)…(256,256)这些位置,通过式1就可以计算出其在A中的位置,从而可以得到灰度值。但是,对于B中的(1,1),(1,2),(1,3)…等等这些坐标点而言,如果按照式1计算的话,那么它们在A中对应的坐标不再是整数。比如,对于B中的坐标点(1,1),其在A中的对应坐标就变成了(0.25,0.25)。对于数字图像而言,小数坐标是没有意义的。因此,必须考虑采用某种方法来得到B中像素点在A中对应位置上的灰度级。处理这一问题的方法被称为图像灰度级插值。常用的插值方式有三种:最近邻域插值、双线性插值、双三次插值。理论上来讲,最近邻域插值的效果最差,双三次插值的效果最好,双线性插值的效果介于两者之间。不过对于要求不是非常严格的图像插值而言,使用双线性插值通常就足够了。
本文中将采用matlab实现一个双线性插值的程序。双线性插值的原理如图2所示。图像之间坐标映射有两种方式:如果是从原图像的坐标映射到目标图像,称为前向映射,反之则称为后向映射。前向映射指的是通过源图像计算得到目标图像的像素点,常用在图像的平移和镜像操作。后向映射指的是在目标图像中反着对应源图像,如果找到对应的像素点,那么就将该像素点进行填充,如果没有找到,就要采用插值算法进行像素的运算,之后进行插入。显然,双线性插值采用的是后向映射方式。下面对图2的具体含义进行说明。首先,根据几何关系,从B图像中的坐标(x,y)得到A图像中的坐标(x/4,y/4),但是,映射得到的这个坐标(x/4,y/4)并没有刚好位于A图像中的整数坐标上,而是映射到了四个像素坐标(a,b)、(a+1,b)、(a,b+1)、(a+1,b+1)所围成的矩形之间,其中,a、b是A图像的整数坐标。现在的问题就是如何根据A(a,b)、A(a+1,b)、A(a,b+1)、A(a+1,b+1)这四个点上的灰度级求出A(x/4,y/4)处的灰度级。双线性插值技术采用的方法是:假设A图像的灰度级变化在纵向方向上是线性变化的,这样根据直线方程或者几何比例关系就能够求得(a,y/4)和(a+1,y/4)坐标处的灰度级A(a,y/4)和A(a+1,y/4)。然后,再假设在((a,y/4),A(a,y/4))和(a+1,y/4),A(a+1,y/4))这两点所确定的直线上,灰度级仍然是线性变化的。求出直线方程,于是就可以求得(x/4,y/4)处的灰度级A(x/4,y/4)。这就是双线性插值的基本思路。其中用到的两个基本假设是:首先灰度级在纵向方向上是线性变化的,然后假定灰度级在横向方向上也是线性变化的。
图1 图像缩放示意图
图2 双线性插值示意图
Matlab代码:
I=imread('geometricTransformationOfImage\sourceImg\cameraman.tif');[m,n]=size(I);K=3;width = K * m;height = K * n;J = uint8(zeros(width,height));% width scale and height scalewidthScale = m/width;heightScale = n/height; % bilinear interplot for x = 5:width - 5 for y = 5:height - 5 xx = x * widthScale; yy = y * heightScale; if (xx/double(uint16(xx)) == 1.0) & (xx/double(uint16(xx)) == 1.0) J(x,y) = I(int16(xx),int16(yy)); else % a or b is not integer a = double(uint16(xx)); % (a,b) is the base-dot b = double(uint16(yy)); x11 = double(I(a,b)); % x11 <- I(a,b) x12 = double(I(a,b+1)); % x12 <- I(a,b+1) x21 = double(I(a+1,b)); % x21 <- I(a+1,b) x22 = double(I(a+1,b+1)); % x22 <- I(a+1,b+1) J(x,y) = uint8( (b+1-yy) * ((xx-a)*x21 + (a+1-xx)*x11) + (yy-b) * ((xx-a)*x22 +(a+1-xx) * x12)); % calculate J(x,y) end endend% 显示图像imwrite(J, '放大的图像.jpg', 'jpg');imshow(I),title('原图');figure imshow(J),title('放大图');这里提供源图片和结果
源图像:
运行结果:
- 双线性插值原理与实现
- 双线性插值原理与实现
- 双线性插值原理与实现
- 双线性插值算法原理及其实现
- 双线性插值原理及其实现--基于OpenCV实现
- 双线性插值的图像缩放算法的研究与实现
- 双线性插值的图像缩放算法的研究与实现
- 双线性插值的图像缩放算法的研究与实现
- 双线性插值的图像缩放算法的研究与实现
- 双线性插值的图像缩放算法的研究与实现
- 双线性插值的图像缩放算法的研究与实现
- 双线性插值实现图像缩放
- 双线性插值(Matlab实现)
- OpenCL应用与双线性插值
- 什么是线性插值原理 什么是双线性插值?
- 双线性插值原理简单通俗解释
- 我与插值萍水相逢续(1): 双线性插值(Bilinear Interpolation)原理及使用
- 双线性插值缩放图片算法java实现
- 【noip 2013】火柴排队
- [ Java学习 ] 一些Java程序 002
- Handler+ImageView控件实现定时换图片
- oracle中integer、pls_integer和number类型
- C语言第六章重要知识总结
- 双线性插值原理与实现
- 基于 mesos 的容器调度框架
- 微信小程序踩坑——Android真机调试问题
- tomcat启动慢, Creation of SecureRandom instance for session ID generation using [SHA1PRNG]took [xx] mil
- JavaIO与异常基础
- LeetCode.561 Array Partition I
- 暂时解决 Android-Studio 编译耗时(好久、太长)问题
- bzoj 2818 GCD(欧拉函数)
- 计算机网络学习笔记2