美文网首页
图像处理|插值

图像处理|插值

作者: reallocing | 来源:发表于2018-11-22 14:00 被阅读0次

opencv

cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) → dst

interpolation 选项 所用的插值方法
INTER_NEAREST 最近邻插值
INTER_LINEAR 双线性插值(默认设置)
INTER_AREA 使用像素区域关系进行重采样。 它可能是图像抽取的首选方法,因为它会产生无云纹理的结果。 但是当图像缩放时,它类似于INTER_NEAREST方法。
INTER_CUBIC 4x4像素邻域的双三次插值
INTER_LANCZOS4 8x8像素邻域的Lanczos插值

最近邻插值

我们就举个简单的图像:33 的256级灰度图。假如图像的象素矩阵如下图所示(这个原始图把它叫做源图,Source):
234 38 22
67 44 12
89 65 63
  这 个矩阵中,元素坐标(x,y)是这样确定的,x从左到右,从0开始,y从上到下,也是从零开始,这是图象处理中最常用的坐标系。
  如果想把这副图放大为 4
4大小的图像,那么该怎么做呢?那么第一步肯定想到的是先把44的矩阵先画出来再说,好了矩阵画出来了,如下所示,当然,矩阵的每个像素都是未知数,等待着我们去填充(这个将要被填充的图的叫做目标图,Destination):
  ? ? ? ?
  ? ? ? ?
  ? ? ? ?
  ? ? ? ?
  然后要往这个空的矩阵里面填值了,要填的值从哪里来来呢?是从源图中来,好,先填写目标图最左上角的象素,坐标为(0,0),那么该坐标对应源图中的坐标可以由如下公式得出srcX=dstX
(srcWidth/dstWidth) , srcY = dstY * (srcHeight/dstHeight)
  好了,套用公式,就可以找到对应的原图的坐标了(0(3/4),0(3/4))=>(00.75,00.75)=>(0,0),找到了源图的对应坐标,就可以把源图中坐标为(0,0)处的234象素值填进去目标图的(0,0)这个位置了。
  接下来,如法炮制,寻找目标图中坐标为(1,0)的象素对应源图中的坐标,套用公式:
(10.75,00.75)=>(0.75,0) 结果发现,得到的坐标里面竟然有小数,这可怎么办?计算机里的图像可是数字图像,象素就是最小单位了,象素的坐标都是整数,从来没有小数坐标。这时候采用的一种策略就是采用四舍五入的方法(也可以采用直接舍掉小数位的方法),把非整数坐标转换成整数,好,那么按照四舍五入的方法就得到坐标(1,0),完整的运算过程就是这样的:(10.75,00.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 ,那么目标象素值其实应该根据这个源图中虚拟的点四周的四个真实的点来按照一定的规律计算出来的,这样才能达到更好的缩放效果。

双线性插值

双线型内插值算法就是一种比较好的图像缩放算法,它充分的利用了源图中虚拟点四周的四个真实存在的像素值来共同决定目标图中的一个像素值,因此缩放效果比简单的最邻近插值要好很多。
双线性内插值算法描述如下:
  对于一个目的像素,设置坐标通过反向变换得到的浮点坐标为(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,计算方法

image

首先,在X方向上进行两次线性插值计算,然后在Y方向上进行一次插值计算。

   image image

在图像处理的时候,我们先根据
  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) 。

参考

相关文章

  • 图像处理-插值

    1, 线性插值 Linear Interpolation 在一维空间里,已知两个点的位置及其值,求该两点位置间区域...

  • 图像处理|插值

    opencv interpolation 选项 所用的插值方法INTER_NEAREST 最近邻插值IN...

  • 最临近插值和双线性插值

    插值在图像中的应用一般为处理图像的缩放。所谓缩放就是缩小和放大。在所有插值缩放算法中要数最邻近插值最简单最暴力,当...

  • 图像插值

    最临近插值 最近邻插值在图像放大时补充的像素取最临近的像素的值。由于方法简单,所以处理速度很快,但是放大图像画质劣...

  • 反距离权重IDW算法解析与示例

    在GIS和图像处理中插值算法很常用,散点状的数据面状化。常用的插值方法包括:反距离权重插值法(IDW)、克里金插值...

  • 数字图像处理——图像插值

    作业写不下去了,更网上有很多介绍插值算法的,但感觉收获都不大,必须更 辣鸡编译器,tex在预览模式公式可以显示,从...

  • 最近邻插值与双线性插值基本原理及Python实现

    1 最近邻插值 1.1 基本原理 假定 源图像的尺寸为 经最近邻插值处理后的图像的尺寸为 由此可以得到缩放倍数 现...

  • 图像处理中的插值

    thiele插值算法 1点插值算法 function [C,c]=thiele(X,Y,Z)%X为插值点横坐标,Y...

  • matplotlib的图表组成函数的使用

    本章知识列表 知识运用 当选取10个插值节点是的图像:1.png 当选取300个插值节点时候的图像 散点图图像如下...

  • ANUSPLIN插值后的数据最终处理

    需求 ANUSPLIN插值后的数据一般为没有投影grd格式图像,为了方便后续处理,需将其转为有投影的tif格式图像...

网友评论

      本文标题:图像处理|插值

      本文链接:https://www.haomeiwen.com/subject/llmcqqtx.html