双线性插值计算公式:

f(i+u,j+v) = (1-u)(1-v)f(i,j)+u(1-v)f(i+1,j)+(1-u)vf(i,j+1)+uvf(i+1,j+1)

这个公式表明了如何利用矩阵中的四个像素值计算新的像素值,这些新的像素值就组成了放大后的图像。

下图是如何将3x3的图像放大为4x4的图像:

原图像表示为3x3的矩阵(像素值处在黑线的交叉点上),如何计算4x4矩阵的值呢?(像素值处在红色虚线交叉点及红线与黑线的交点上)

比如新图像B的第一列与原图像A的第一列的对应关系是:

B(1,1) = A(1,1)

B(1,2) = A(1,1.66667)

B(1,3) = A(1,2.33334)

B(1,4) = A(1,3.00001)

用原图像A的值就能计算出放大后B的值,是不是很神奇?

实际上可以这样认为:双线性插值就是把放大后的图像再压缩到原来图像的尺寸大小,计算原图像中虚拟的像素值,等同于计算放大后图像的像素值,

对于本例来说,B图像的步长相当于A图像步长的(3-1)/(4-1)=0.66667倍。下面我们就可以利用这个比率来对应B中像素位置与A中虚拟像素位置的关系。

B(1,1) = A(1,1)                    (1-1)*0.66667+1=1

B(1,2) = A(1,1.66667)         (2-1)*0.66667+1=1.66667

B(1,3) = A(1,2.33334)         (3-1)*0.66667+1=2.33334

B(1,4) = A(1,3.00001)         (4-1)*0.66667+1=3.00001

根据上面的对应关系,我们就可以用代码实现了。

现在还有一个问题:

我们计算虚拟像素值是需要周围四个原像素值,比如上列中的(下图中红圈圈住的部分)

A(1,3) = (1-0)(1-0)A(1,3) + (1-0)0A(1,4) + 0(1-0)A(2,3) + 00A(2,4)

显然这里的A(1,4)和A(2,4)是无法索引到得,因为原图像是3x3的矩阵。

为了解决这个问题,在A的最后一行,与最后一列分别加上0,这样A就变成了4x4的矩阵。

图示中黑色虚线是添加的0行0列,红色斜箭头把需要用到扩展A矩阵的虚拟像素点位置都标了出来。

代码实现:

主程序代码:

clear ; close all;clc

image= imread(‘bird.png‘);%载入图像的值

r= image(:,:,1);%由于真彩图是红蓝绿三个像素的叠加

g= image(:,:,2);%这里把r,g,b分离出来单独调用函数计算

b= image(:,:,3);%计算完成后再进行组装

%这里需要手动设置放大的倍数

w= 4;%w放大的是竖直方向

l= 4;%l放大的是水平方向

r= extenRGB(r,w,l);%调用函数计算放大后的r值

g= extenRGB(g,w,l);%调用函数计算放大后的g值

b= extenRGB(b,w,l);%调用函数计算放大后的b值

%下面把计算完成后的rgb再组装起来

outRGB(:,:,1) = r;outRGB(:,:,2) = g;outRGB(:,:,3) = b;outRGB= uint8(outRGB);%格式转换,否则无法显示

imshow(outRGB);%显示放大后的图像

主程序调用的函数:

%像素放大计算函数 extenRGB()

function Output=extenRGB(A,w,l)%A矩阵分别代表r,g,b矩阵

[m,n]= size(A); %读取A的行和列

A= [A;zeros(1,n)]; %在A的最后一行加入两行0

A= [A zeros(m+1,1)]; %在A的最后一列加入两列0%这样A就变成(m+1)x(n+1)的矩阵,这是为了解决索引A矩阵时的边界溢出问题

ini_u= (m-1)/(w*m-1); %步长比,如果把原来的一步A(1,1)到A(2,1)看做1,那么计算放大后的

ini_v= (n-1)/(l*n-1); %图像B(2,1)相当于计算A(1+ini_u,1),即每步相当于加1

Output= zeros(w*m,l*n); %初始化输出矩阵for j = 1:l*n; %左边两个语句的功能是:z_u,z_v向左取整,u,v取小数,原理如下

z_v= floor((j-1)*ini_v+1); %比如A为3x3的矩阵,要放大为Output是4x4大小,即放大了4/3倍,

v= (j-1)*ini_v+1 - z_v; %新的一步的距离相当于原来的(3-1)/(4-1)=0.66667

for i = 1:w*m; %Output(1,1) = A(1,1) %(1-1)*0.66667+1=1z_u= floor((i-1)*ini_u+1); %Output(1,2) = A(1,1.66667) %(2-1)*0.66667+1=1.66667u= (i-1)*ini_u+1 - z_u; %Output(1,3) = A(1,2.33334) %(3-1)*0.66667+1=2.33334

%Output(1,4) = A(1,3.00001) %(4-1)*0.66667+1=3.00001

%===================下面是双线性插值的代码实现================================Output(i,j)= (1 - u)*(1 - v)*A(z_u, z_v ) +...

(1 - u)* v *A(z_u, z_v + 1) +...

u*(1 - v)*A(z_u + 1, z_v ) +...

u* v *A(z_u + 1, z_v + 1);

end

end

matlab实现双线性插值,使用双线性插值法放大图像(matlab实现)相关推荐

  1. matlab图片插值数据_使用双线性插值法放大图像(matlab实现)

    双线性插值计算公式: f(i+u,j+v) = (1-u)(1-v)f(i,j)+u(1-v)f(i+1,j)+(1-u)vf(i,j+1)+uvf(i+1,j+1) 这个公式表明了如何利用矩阵中的四 ...

  2. “双线性插值法”实现图像的缩放

    本学期修读"数学实验"相关课程,课程设计以"双线性插值法实现图像缩放"为研究方向,写篇博文记录一下自己的心路历程– 文章目录 前言 一.图像基础知识 二.双线性 ...

  3. Opencv下双线性插值法进行图像放缩

    关于图像放缩的算法有很多,本文主要介绍双线性插值法进行图像放缩,本文参考了: http://www.cnblogs.com/funny-world/p/3162003.html 我们设源图像src的大 ...

  4. 【图像处理】双线性插值法扩展图像像素及其代码实现(亚像素)

    亚像素图像 大家有没有你想过,在软件层面,如何提高图像处理的精度?比如,我们要用图像处理测量工业零件的周长,怎么在不改变硬件条件的情况下尽可能得到更高的精度? 我们平时看到的图像都是由像素点组成的,不 ...

  5. opencv:用最邻近插值和双线性插值法实现上采样(放大图像)与下采样(缩小图像)

    上采样与下采样 概念: 上采样: 放大图像(或称为上采样(upsampling)或图像插值(interpolating))的主要目的 是放大原图像,从而可以显示在更高分辨率的显示设备上. 下采样: 缩 ...

  6. 第2章 Python 数字图像处理(DIP) --数字图像基础3 - 图像内插 - 最近邻内插 - 双线性插值 - 双三次内插 - 图像放大

    目录 图像内插 放大图像 图像内插 内插通常在图像放大.缩小.旋转和几何校正等任务中使用.内插并用它来调整图像的大小(缩小和放大),缩小和放大基本上采用图像重取样方法 最近邻内插,这种方法将原图像中最 ...

  7. 上采样(放大图像)和下采样(缩小图像)(最邻近插值和双线性插值的理解和实现)

    上采样和下采样 什么是上采样和下采样? • 缩小图像(或称为下采样(subsampled)或降采样(downsampled))的主要目的有 两个:1.使得图像符合显示区域的大小:2.生成对应图像的缩略 ...

  8. 双线性插值法图像放缩示例

    算法原理简介 双线性插值是一阶插值,常用于图像的旋转.缩放处理. 它利用原图中对应的四个点的像素值来确定目标图像中的像素值. 为了便于理解,我们来看两张尺寸不一样的图片: 原图 变换图 假设原图图片的 ...

  9. bmp 双线性插值_基于双线性插值算法的图像放缩技术与实现_冯慧君

    九江 332000) 2 ( 闽发证券有限责任公司 上海 200031) 3 ( 华为技术有限公司 上海 200121) 摘 要 本文介绍了双线性插值算法在图像放缩领域的应用和具体实现的方法 , 并通 ...

  10. 利用图像内插法放大缩小图像 Matlab

    原文:https://blog.csdn.net/Goldfish442/article/details/61933735 利用图像内插法放大缩小图像 Matlab 内插是利用已知数据来估计未知位置的 ...

最新文章

  1. 青少年电子信息智能创新大赛 -- Python编程挑战赛初赛试题说明
  2. windows server 2016安装oracle 10_Weblogic12.1.3.0补丁安装(win server与linux安装步骤介绍)
  3. 惠普m1005连接电脑步骤_电脑连接电视机详细步骤方法图文
  4. .Net程序内存泄漏解析
  5. python特性 property_python之中特性(attribute)与属性(property)有什么区别?
  6. Windows services相关命令
  7. sql统计系统时间那一个月数量_关于BE00007图书借阅管理系统bug修复总结
  8. 画一画javascript原型链
  9. SWIFT调用C语言
  10. MongoDB 主从架构
  11. Java知多少(76)语言包(java.lang)简介
  12. Windows核心编程笔记
  13. HCIE Security SSL 备考笔记(幕布)
  14. 如何快速进入/打开cmd--快捷键
  15. Mathpix小工具下载
  16. 用c#二次开发的焊锡检测视觉系统
  17. win 7笔记本连接wifi不能输入密码解决办法(图文教程)
  18. 北京君正案例:超能面板PRO采用4英寸IPS超清多彩屏,值不值得买?
  19. 越狱Season 1-Episode 7: Riots, Drills and the Devil: Part 2
  20. 自定义创建rabbitMQ的channel连接池

热门文章

  1. Operator norm - 算子范数
  2. 详解 欧拉角与四元数
  3. 高中计算机会考vb试题,高中信息技术考试vb程序题及答案
  4. Linux内核网络:实现与理论--序言
  5. linux ad7705驱动程序,tm7705_51单机片驱动
  6. Lisp编制的坡度标注_形位公差自动标注的ATUOLISP程序设计(Ⅰ)
  7. 显卡功耗测试用什么软件,跑什么测试显卡功耗最高:这20个项目能给你答案
  8. 惠普笔记本电脑驱动BIOS下载中心,战66驱动下载
  9. Struts2通配符接收参数
  10. 2G GSM基站的工作原理