文档章节

图像处理界双线性插值算法的优化

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:41
字数 1075
阅读 4
收藏 0
点赞 0
评论 0

  在图像处理中,双线性插值算法的使用频率相当高,比如在图像的缩放中,在所有的扭曲算法中,都可以利用该算法改进处理的视觉效果。首先,我们看看该算法的简介。

     在数学上,双线性插值算法可以看成是两个变量间的线性插值的延伸。执行该过程的关键思路是先在一个方向上执行线性插值,然后再在另外一个方向上插值。下图示意出这个过程的大概意思。

     用一个简单的数学表达式可以表示如下:

     f(x,y)=f(0,0)(1-x)(1-y)+f(1,0)x(1-y)+f(0,1)(1-x)y+f(1,1)xy

     合并有关项,可写为: f(x,y)=(f(0,0)(1-x)+f(1,0)x) (1-y)+(f(0,1)(1-x)+f(1,1)x)y

     由上式可以看出,这个过程存在着大量的浮点数运算,对于图像这样大的计算用户来说,是一个较为耗时的过程。

     考虑到图像的特殊性,他的像素值的计算结果需要落在0到255之间,最多只有256种结果,由上式可以看出,一般情况下,计算出的f(x,y)是个浮点数,我们还需要对该浮点数进行取整。因此,我们可以考虑将该过程中的所有类似于1-x、1-y的变量放大合适的倍数,得到对应的整数,最后再除以一个合适的整数作为插值的结果。

      如何取这个合适的放大倍数呢,要从三个方面考虑,第一:精度问题,如果这个数取得过小,那么经过计算后可能会导致结果出现较大的误差。第二,这个数不能太大,太大会导致计算过程超过长整形所能表达的范围。第三:速度考虑。假如放大倍数取为12,那么算式在最后的结果中应该需要除以12*12=144,但是如果取为16,则最后的除数为16*16=256,这个数字好,我们可以用右移来实现,而右移要比普通的整除快多了。 

      综合考虑上述三条,我们选择2048这个数比较合适。

      下面我们假定某个算法得到了我们要取样的坐标分别PosX以及PosY,其中PosX=25.489,PosY=58.698。则这个过程的类似代码片段如下:

 1 NewX =  Int(PosX)                         ' 向下取整,NewX=25
 2  NewY =  Int(PosY)                         ' 向下取整,NewY=58
 3  PartX = (PosX - NewX) *  2048             ' 对应表达式中的X
 4  PartY = (PosY - NewY) *  2048             ' 对应表达式中的Y
 5  InvX =  2048 - PartX                      ' 对应表达式中的1-X
 6  InvY =  2048 - PartY                      ' 对应表达式中的1-Y
 7 
 8 Index1 = SamStride * NewY + NewX *  3     ' 计算取样点左上角邻近的那个像素点的内存地址
 9  Index2 = Index1 + SamStride           ' 左下角像素点地址
10 ImageData(Speed +  2) = ((Sample(Index1 +  2) * InvX + Sample(Index1 +  5) * PartX) * InvY + (Sample(Index2 +  2) * InvX + 
                          Sample(Index2 +  5) * PartX) * PartY) \  4194304       '处理红色分量
11 ImageData(Speed +  1) = ((Sample(Index1 +  1) * InvX + Sample(Index1 +  4) * PartX) * InvY + (Sample(Index2 +  1) * InvX +
                          Sample(Index2 +  4) * PartX) * PartY) \  4194304       '处理绿色分量
12 ImageData(Speed) = ((Sample(Index1) * InvX + Sample(Index1 +  3) * PartX) * InvY + (Sample(Index2) * InvX +
                      Sample(Index2 +  3) * PartX) * PartY) \  4194304           '处理蓝色分量

      以上代码中涉及到的变量都为整型(PosX及PosY当然为浮点型)。

      代码中Sample数组保存了从中取样的图像数据,SamStride为该图像的扫描行大小。

      观察上述代码,除了有2句涉及到了浮点计算,其他都是整数之间的运算。

      在Basic语言中,编译时如果勾选所有的高级优化,则\ 4194304会被编译为>>22,即右移22位,如果使用的是C语言,则直接写为>>22。

      需要注意的是,在进行这代代码前,需要保证PosX以及PosY在合理的范围内,即不能超出取样图像的宽度和高度范围。

      通过这样的改进,速度较直接用浮点类型快至少100%以上,而处理后的效果基本没有什么区别。

      共享一段利用该方式处理图像缩放的程序:http://files.cnblogs.com/Imageshop/VBScale.rar

  

本文转载自:http://www.cnblogs.com/Imageshop/archive/2011/11/12/2246808.html

共有 人打赏支持
abcijkxyz
粉丝 60
博文 6196
码字总数 1876
作品 0
深圳
项目经理
【图像缩放】双线性插值

前言 图像处理中有三种常用的插值算法: 最邻近插值 双线性插值 双立方(三次卷积)插值 本文介绍其中的 如果想先看效果和源码,可以拉到最底部 何时进行双线性插值 相比于最邻近插值的粗糙以...

撒网要见鱼
2017/11/02
0
0
【图像缩放】最邻近插值

前言 图像处理中有三种常用的插值算法: 最邻近插值 双线性插值 双立方(三次卷积)插值 本文介绍其中的 如果想先看效果和源码,可以拉到最底部 何时进行最邻近插值 这个算法的特点是 速度非...

撒网要见鱼
2017/11/02
0
0
【图像缩放】双立方(三次)卷积插值

前言 图像处理中有三种常用的插值算法: 最邻近插值 双线性插值 双立方(三次卷积)插值 其中效果最好的是,本文介绍它的原理以及使用 如果想先看效果和源码,可以拉到最底部 本文的契机是某...

撒网要见鱼
2017/11/02
0
0
常用的像素操作算法:Resize、Flip、Rotate

Resize 图像缩放是把原图像按照目标尺寸放大或者缩小,是图像处理的一种。 图像缩放有多种算法。最为简单的是最临近插值算法,它是根据原图像和目标图像的尺寸,计算缩放的比例,然后根据缩放...

fengzhizi715
2017/12/14
0
0
【图像缩放】双立方(三次)卷积插值

前言 图像处理中有三种常用的插值算法: 最邻近插值 双线性插值 双立方(三次卷积)插值 其中效果最好的是,本文介绍它的原理以及使用 如果想先看效果和源码,可以拉到最底部 本文的契机是某...

dailc
07/01
0
0
【图像缩放】双立方(三次)卷积插值

前言 图像处理中有三种常用的插值算法: 最邻近插值 双线性插值 双立方(三次卷积)插值 其中效果最好的是,本文介绍它的原理以及使用 如果想先看效果和源码,可以拉到最底部 本文的契机是某...

撒网要见鱼
2017/11/02
0
0
5- OpenCV+TensorFlow 入门人工智能图像处理-图片的几何变换(一)

图片的几何变换 图片的几何变换章节介绍 图片位移 & 图片缩放 图片剪切 & 图片镜像 图片仿射变换 Hog + Svm 小狮子识别 计算机视觉的基础: 裁剪样本为64,128 等比例缩放 仿射变换: 位移,旋转...

天涯明月笙
04/19
0
0
【图像处理】图像灰度级减少, 图像缩放(Reducing the Number of Gray Levels, Zooming and Shrinking)

实验要求 (1.a) 编写一个以2 的幂次方将给定图像的灰度级数从256 减少到2 的程序。图像的灰度级数以参数变量的形式传递到所编写的程序中。 (1.b) 使用图2.21(a) 以(1.a)中编写的程序生成图2...

u013165921
01/14
0
0
(伍)规划师方向技能:基于ArcGIS的栅格数据重采样方法

1、引言 在规划分析中,经常需要将各类评估指标进行量化,然后生成栅格数据,处理栅格数据时,由于数据像元大小不符合要求,或者在进行栅格数据配准后,像元发生倾斜,或者对多个栅格数据进行...

gis_bt
05/25
0
0
6- OpenCV+TensorFlow 入门人工智能图像处理-图片移位

图片移位 opencvAPI实现 算法原理 源代码实现 原始图片和移位后图片 图片位移的算法原理 分析api实现原理 分析像素移动实现原理 偏移矩阵 完成矩阵的运算 输入的xy定义为C 结果: (10,20)->(1...

天涯明月笙
05/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

【RocketMQ】Message存储笔记

概述 消息中间件存储分为三种,一是保存在内存中,速度快但会因为系统宕机等因素造成消息丢失;二是保存在内存中,同时定时将消息写入DB中,好处是持久化消息,如何读写DB是MQ的瓶颈;三是内...

SaintTinyBoy
5分钟前
0
0
Android应用Context详解及源码解析

Android应用Context详解及源码解析 本文定位:优质文章收集 本文转载 1 背景 今天突然想起之前在上家公司(做TV与BOX盒子)时有好几个人问过我关于Android的Context到底是啥的问题,所以就马...

lichuangnk
36分钟前
0
0
PostgreSQL的昨天今天和明天

PostgreSQL 是一种非常复杂的对象-关系型数据库管理系统(ORDBMS), 也是目前功能最强大,特性最丰富和最复杂的自由软件数据库系统。有些特性甚至连商业数据库都不具备。 这个起源于伯克利(...

闻术苑
41分钟前
0
0
Mysql对自增主键ID进行重新排序

1,删除原有主键: ALTER TABLE `table_name` DROP `id`; 2,添加新主键字段: ALTER TABLE `table_name` ADD `id` MEDIUMINT( 8 ) NOT NULL FIRST; 3,设置新主键: ALTER TABLE `table_nam......

niithub
47分钟前
0
0
福利篇:免费csdn vip账号分享

分享一个发布免费csdn vip账号的网站:啰嗦vip www.lostvip.com , 各种软件开发类的视频教程:慕课网、动脑学院、黑马各大培训机构VIP视频教程,非常不错!

在水一方发盐人
53分钟前
0
0
Nginx+Tomcat搭建高性能负载均衡集群

一、 工具   nginx-1.8.0   apache-tomcat-6.0.33 二、 目标   实现高性能负载均衡的Tomcat集群:    三、 步骤   1、首先下载Nginx,要下载稳定版:      2、然后解压两个Tom...

码代码的小司机
54分钟前
0
0
Centos7编译安装ntp-4.2.8p11

Centos7编译安装ntp-4.2.8p11 背景 因公司做等保评级,在进行安全漏洞检测时发现ntp需要升级到ntp-4.2.7p25以上版本,经过一番搜索,没有该版本及新版本ntp的yum安装包,所以只能编译安装了,...

阿dai
今天
0
0
antd pro 新增模块的步骤

index.js是整个项目的入口文件。 // 1. Initializeconst app = dva({ history: createHistory(),});// 2. Pluginsapp.use(createLoading());// 3. Register global modelapp.model......

灯下草虫鸣_
今天
0
0
Cisco VPN在win10下报Error 56的解决办法

问题描述 Cisco VPN在win10下报Error 56: The Cisco Systems, Inc. VPN Service has not been started 解决方案 方案一:在计算机管理-》服务 查看Cisco Systems, Inc. VPN Service服务是否存...

chenfj_fer
今天
0
0
Weblogic问题解决记录

问题:点击登录,页面刷新但是不进去管理界面。解决:删除cookies再登录。

wffger
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部