几种图像插值算法的意义与实现

这篇具有很好参考价值的文章主要介绍了几种图像插值算法的意义与实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

几种图像插值算法的意义与实现

图像插值定义:

图像插值是在基于模型框架下,从低分辨率图像生成高分辨率图像的过程,用以恢复图像中所丢失的信息。

图像分辨率 插值,算法,计算机视觉,opencv

分类

主要可以分为两类,一类是线性图像插值方法,另一类是非线性图像插值方法,如下图所示。传统的插值方法如最近邻插值,双线性插值以及双三次插值等都属于线性插值方法。这类插值方法在图像插值过程中采用同一种插值内核,不用考虑待插像素点所处的位置,这种做法会使图像中的边缘变得模糊不清,达不到高清图像的视觉效果。非线性插值方法主要包括:基于小波系数的方法基于边缘信息的方法其中,基于边缘信息的方法又可分为隐式方法和显式方法 两种。,其中隐式方法包含边缘导向插值(New edge directive interpolation,NEDI),最小均方误差估计插值(Linear minimum mean square-error estimation,LMMSE)软判决自适应插值(Soft-decision adaptive interpolation interpolation,SAI),提出的边缘对比度引导的图像插值(Contrast-guideed image interpolation,CGI)等都是隐式的基于图像边缘的插值方法。图像分辨率 插值,算法,计算机视觉,opencv

线性插值法

1,原理

在图像的仿射变换中,很多地方需要用到插值运算,常见的插值运算包括最邻近插值,双线性插值,双三次插值,兰索思插值等方法,OpenCV提供了很多方法,其中,双线性插值由于折中的插值效果和运算速度,运用比较广泛。
  越是简单的模型越适合用来举例子,我们就举个简单的图像:3 * 3 的256级灰度图。假如图像的像素矩阵如下图所示(这个原始图把它叫做源图,Source):
  234 38 22
  67 44 12
  89 65 63
  这个矩阵中,元素坐标(x,y)是这样确定的,x从左到右,从0开始,y从上到下,也是从零开始,这是图象处理中最常用的坐标系。
  如果想把这副图放大为 4 * 4大小的图像,那么该怎么做呢?那么第一步肯定想到的是先把4 * 4的矩阵先画出来再说,好了矩阵画出来了,如下所示,当然,矩阵的每个像素都是未知数,等待着我们去填充(这个将要被填充的图的叫做目标图,Destination):
  ? ? ? ?
  ? ? ? ?
  ? ? ? ?
  ? ? ? ?
  然后要往这个空的矩阵里面填值了,要填的值从哪里来来呢?是从源图中来,好,先填写目标图最左上角的像素,坐标为(0,0),那么该坐标对应源图中的坐标可以由如下公式得出
  srcX=dstX * (srcWidth/dstWidth) ,
  srcY = dstY * (srcHeight/dstHeight)
  好了,套用公式,就可以找到对应的原图的坐标了(0 * (3/4),0*(3/4))=>(0 * 0.75,0 * 0.75)=>(0,0),找到了源图的对应坐标,就可以把源图中坐标为(0,0)处的234像素值填进去目标图的(0,0)这个位置了。
  接下来,如法炮制,寻找目标图中坐标为(1,0)的像素对应源图中的坐标,套用公式:
(1 * 0.75,0 * 0.75)=>(0.75,0)
结果发现,得到的坐标里面竟然有小数,这可怎么办?计算机里的图像可是数字图像,像素就是最小单位了,像素的坐标都是整数,从来没有小数坐标。这时候采用的一种策略就是采用四舍五入的方法(也可以采用直接舍掉小数位的方法),把非整数坐标转换成整数,好,那么按照四舍五入的方法就得到坐标(1,0),完整的运算过程就是这样的:(1 * 0.75,0 * 0.75)=>(0.75,0)=>(1,0) 那么就可以再填一个像素到目标矩阵中了,同样是把源图中坐标为(1,0)处的像素值38填入目标图中的坐标。
  依次填完每个象素,一幅放大后的图像就诞生了,像素矩阵如下所示:
  234 38 22 22
  67 44 12 12
  89 65 63 63
  89 65 63 63
  这种放大图像的方法叫做最临近插值算法,这是一种最基本、最简单的图像缩放算法,效果也是最不好的,放大后的图像有很严重的马赛克,缩小后的图像有很严重的失真;效果不好的根源就是其简单的最临近插值方法引入了严重的图像失真,比如,当由目标图的坐标反推得到的源图的的坐标是一个浮点数的时候,采用了四舍五入的方法,直接采用了和这个浮点数最接近的象素的值,这种方法是很不科学的,当推得坐标值为 0.75的时候,不应该就简单的取为1,既然是0.75,比1要小0.25 ,比0要大0.75 ,那么目标像素值其实应该根据这个源图中虚拟的点四周的四个真实的点来按照一定的规律计算出来的,这样才能达到更好的缩放效果。
  双线型内插值算法就是一种比较好的图像缩放算法,它充分的利用了源图中虚拟点四周的四个真实存在的像素值来共同决定目标图中的一个像素值,因此缩放效果比简单的最邻近插值要好很多。
  接下来先讲一下单线性插值法
  已知数据 (x0, y0) 与 (x1, y1),要计算 [x0, x1] 区间内某一位置 x 在直线上的y值。图像分辨率 插值,算法,计算机视觉,opencv图像分辨率 插值,算法,计算机视觉,opencv
上面比较好理解吧,仔细看就是用x和x0,x1的距离作为一个权重,用于y0和y1的加权。双线性插值本质上就是在两个方向上做线性插值

双线性内插值算法描述如下:
  对于一个目的像素,设置坐标通过反向变换得到的浮点坐标为(i+u,j+v) (其中i、j均为浮点坐标的整数部分,u、v为浮点坐标的小数部分,是取值[0,1)区间的浮点数),则这个像素得值 f(i+u,j+v) 可由原图像中坐标为 (i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)所对应的周围四个像素的值决定,即:
  f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1)
其中f(i,j)表示源图像(i,j)处的的像素值,以此类推。
  比如,像刚才的例子,现在假如目标图的像素坐标为(1,1),那么反推得到的对应于源图的坐标是(0.75 , 0.75), 这其实只是一个概念上的虚拟象素,实际在源图中并不存在这样一个像素,那么目标图的像素(1,1)的取值不能够由这个虚拟像素来决定,而只能由源图的这四个像素共同决定:(0,0)(0,1)(1,0)(1,1),而由于(0.75,0.75)离(1,1)要更近一些,那么(1,1)所起的决定作用更大一些,这从公式1中的系数uv=0.75×0.75就可以体现出来,而(0.75,0.75)离(0,0)最远,所以(0,0)所起的决定作用就要小一些,公式中系数为(1-u)(1-v)=0.25×0.25也体现出了这一特点。

2,计算方法

图像分辨率 插值,算法,计算机视觉,opencv
首先,在X方向上进行两次线性插值计算,然后在Y方向上进行一次插值计算。
图像分辨率 插值,算法,计算机视觉,opencv
图像分辨率 插值,算法,计算机视觉,opencv
在图像处理的时候,我们先根据
  srcX=dstX* (srcWidth/dstWidth) ,
  srcY=dstY * (srcHeight/dstHeight)
来计算目标像素在源图像中的位置,这里计算的srcX和srcY一般都是浮点数,比如f(1.2, 3.4)这个像素点是虚拟存在的,先找到与它临近的四个实际存在的像素点
  (1,3) (2,3)
  (1,4) (2,4)
  写成f(i+u,j+v)的形式,则u=0.2,v=0.4, i=1, j=3
  在沿着X方向差插值时,f(R1)=u(f(Q21)-f(Q11))+f(Q11)
  沿着Y方向同理计算。
  或者,直接整理一步计算,
  f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1) 。 (因为 x = i + u x=i+u x=i+u, x 2 = i + 1 x_2=i+1 x2=i+1,所以 x 2 − x = 1 − u x_2-x=1-u x2x=1u,且分母 ( x 2 − x 1 ) ( y 2 − y 1 ) = 1 (x_2-x_1)(y_2-y_1)=1 (x2x1)(y2y1)=1

3,加速以及优化策略

单纯按照上文实现的插值算法只能勉强完成插值的功能,速度和效果都不会理想,在具体代码实现的时候有些小技巧。参考OpenCV源码以及网上博客整理如下两点:

  • 源图像和目标图像几何中心的对齐。
  • 将浮点运算转换成整数运算
3.1 源图像和目标图像几何中心的对齐

方法: 在计算源图像的虚拟浮点坐标的时候,一般情况:
  srcX=dstX* (srcWidth/dstWidth) ,
  srcY=dstY * (srcHeight/dstHeight)
  中心对齐(OpenCV也是如此):
  SrcX=(dstX+0.5)* (srcWidth/dstWidth) -0.5
  SrcY=(dstY+0.5) * (srcHeight/dstHeight)-0.5

3.2 将浮点运算转换成整数运算

直接进行计算的话,由于计算的srcX和srcY 都是浮点数,后续会进行大量的乘法,而图像数据量又大,速度不会理想,解决思路是:
浮点运算→→整数运算→→”<<左右移按位运算”
  放大的主要对象是u,v这些浮点数,OpenCV选择的放大倍数是2048,如何取这个合适的放大倍数呢,要从三个方面考虑,第一:精度问题,如果这个数取得过小,那么经过计算后可能会导致结果出现较大的误差。第二,这个数不能太大,太大会导致计算过程超过长整形所能表达的范围。第三:速度考虑。假如放大倍数取为12,那么算式在最后的结果中应该需要除以12 * 12=144,但是如果取为16,则最后的除数为16*16=256,这个数字好,我们可以用右移来实现,而右移要比普通的整除快多了。我们利用左移11位操作就可以达到放大目的。
参考资料
[1] OpenCV ——双线性插值(Bilinear interpolation)
[2] 图像插值算法概览及代码实现
[3] 图像处理+双线性插值法文章来源地址https://www.toymoban.com/news/detail-776599.html

到了这里,关于几种图像插值算法的意义与实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ​目标检测算法——YOLOv5/YOLOv7改进之结合​SOCA(单幅图像超分辨率)

    (一)前沿介绍 论文题目:Second-order Attention Network for Single Image Super-Resolution 论文地址:CVPR19 超分辨率 代码地址:https://github.com/daitao/SAN 1.SOCA moudle结构图 2.相关实验结果 (二)YOLOv5/YOLOv7改进之结合​SOCA 1.配置common.py文件 2.配置yolo.py文件 3.配置yolov5/yolov7_SOCA moudle.yaml文件

    2024年02月07日
    浏览(275)
  • Stable Diffusion: 利用Latent Diffusion Models实现高分辨率图像合成

    原文链接: Stable Diffusion: 利用Latent Diffusion Models实现高分辨率图像合成 Since these diffusion model typically operate directly in pixel space, optimization of powerful DMs often consumes hundreds of GPU days and inference is expensive due to sequential evaluations Reach a near-optimal point between complexity reduction and detail preser

    2024年02月09日
    浏览(66)
  • 图像超分辨率重建概述

    1. 概念:         图像分辨率是一组用于评估图像中蕴含细节信息丰富程度的性能参数,包括时间分辨率、空间分辨率及色阶分辨率等,体现了成像系统实际所能反映物体细节信息的能力。相较于低分辨率图像,高分辨率图像通常包含更大的像素密度、更丰富的纹理细节及更

    2024年02月04日
    浏览(49)
  • 图像超分辨率简单介绍

    图像超分辨率(Image Super-Resolution,简称SR)是一种通过使用计算机算法提高图像分辨率的技术,即从低分辨率的图像中生成高分辨率的图像。图像SR可以在许多领域得到应用,例如计算机视觉、医学成像、遥感等。 图像SR旨在从低分辨率(低清晰度)图像中提高图像质量和信

    2024年02月06日
    浏览(40)
  • ISP之图像降分辨率

    1、图像缩放背景 图像的放大、缩小(简称缩放)是图像处理的一种处理方法。所谓图像缩放是指图像分辨率的改变,它在图像显示、传输、图像分析以及动画制作、电影合成、甚至医学图像处理中都有着相当广泛的应用。比如要在1024 X 768 分辨率的显示器上全屏显示800 X 600 的数

    2024年02月11日
    浏览(46)
  • 图像超分辨率重建(pytorch)

             本文代码主体来自CVPR2020论文《Closed-loop matters: Dual regression networks for single image super-resolution》,但原作者并未提供论文亮点--如何使用unpair数据进行训练的代码,所以我在其基础上补齐了该过程的代码。         代码仓库:https://github.com/VitaminyW/Super_Solution      

    2024年01月16日
    浏览(43)
  • 【图像超分辨率重建】——GRL论文精读笔记

    作者: Yawei Li1 Yuchen Fan2 Xiaoyu Xiang2 Denis Demandolx2 Rakesh Ranjan2 Radu Timofte1;3 Luc Van Gool1;4 期刊: CVPR 引用: * 摘要: 本文的目的是提出一种机制,在全局、区域和局部范围内有效和明确地建立图像层次模型,用于图像修复。为了实现这一目标,我们首先分析了自然图像的两个重要

    2024年02月09日
    浏览(49)
  • 无人机航拍图像的空间分辨率计算

    GSD:无人机/遥感卫星的空间分辨率,指航片/遥感影像一个像素点代表的空间距离。 计算公式: d:单位cm、指空间分辨率。 s:单位µm、指像元大小(像素间距)。 H:单位m、指飞行高度。 f:单位mm、指焦段(即镜头的焦段)。 注意:计算时统一单位。同时,更值得注意的

    2024年02月01日
    浏览(52)
  • 【图像超分辨率重建】——HAT论文精读笔记

    作者: Xiangyu Chen, Xintao Wang, Jiantao Zhou, and Chao Dong 期刊: 引用: 摘要: 基于 Transformer 的方法在图像超分辨率等低级视觉任务中表现出令人印象深刻的性能。然而,我们发现这些网络只能通过归因分析利用有限空间范围的输入信息。这意味着 Transformer 的潜力在现有网络中仍未

    2024年02月08日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包