图像中的插值



内插是在诸如放大、收缩、旋转和几何校正等任务中广泛应用的基本工具。

从根本上看,内插是用已知数据来估计未知位置的数值的处理。用一个简单的例子开始讨论该话题。假设一副图像大小为500X500的像素放大到1.5倍到750X750像素。一种简单的放大方法是创建一个假想的750X750网格,它与原始图像有相同的间隔,然后将其收缩,使它准确的与原图像匹配。显然,收缩 后的750X750网格的像素间隔要小于原始图像的像素间隔。为了对覆盖的每一个点赋以灰度值,在原始图像中寻找最接近的像素,并把该像素的灰度赋给750X750网格中的新像素。当完成对网格中覆盖的所有点的灰度赋值后,就把图像扩展到原来规定的大小,得到放大后的图像。

上述讨论的方法称为最邻近内插值,这种方法把原图像中最近邻的灰度值赋给了每个新位置。这种方法简单,但这种方法有产生不希望的认为缺陷的倾向,如某些直边缘的严重失真。由于这一原因,实际上该方法并不常用。更实用的方法是双线性内插,该方法中,用4个最近邻去估计给定位置的灰度,令(x,y)为想要赋以灰度值的位置的坐标,并令v(x,y)表示灰度值。对于双线性内插来说,赋值公式如下:

v(x,y)=ax+by+cxy+d

4个系数可由4个用(x,y)点最近邻点写出的未知方程确定。双线性插值给出了比最近邻内插好的多的结果,但随之而来的是计算量的增加。

复杂度较高的是双三次内插,它包括16个最近邻点。

其中16个系数可由16个用(x,y)点最近邻点写出的未知方程确定。通常双三次插值在保持细节方面比双线性内插相对要好。

双线性插值

假设源图像大小为mxn,目标图像为axb。那么两幅图像的边长比分别为:m/a和n/b。注意,通常这个比例不是整数,编程存储的时候要用浮点型。目标图像的第(i,j)个像素点(i行j列)可以通过边长比对应回源图像。其对应坐标为(i*m/a,j*n/b)。显然,这个对应坐标一般来说不是整数,而非整数的坐标是无法在图像这种离散数据上使用的。双线性插值通过寻找距离这个对应坐标最近的四个像素点,来计算该点的值(灰度值或者RGB值)。

若图像为灰度图像,那么(i,j)点的灰度值的数学计算模型是:

f(x,y)=b1+b2x+b3y+b4xy

其中b1,b2,b3,b4是相关的系数。关于其的计算过程如下如下:

如图,已知Q12,Q22,Q11,Q21,但是要插值的点为P点,这就要用双线性插值了,首先在x轴方向上,对R1和R2两个点进行插值,这个很简单,然后根据R1和R2对P点进行插值,这就是所谓的双线性插值。

双线性插值,又称为双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。

假如我们想得到未知函数在点P=(x,y)的值,假设我们已知函数fQ11=(x1,y1),Q12=(x1,y2)Q21=(x2,y1),Q22=(x2,y2),四个点的值。

首先在 x 方向进行线性插值,得到

然后在 y 方向进行线性插值,得到

这样就得到所要的结果f(x,y)

如果选择一个坐标系统使得 f的四个已知点坐标分别为 (0, 0)、(0, 1)、(1, 0) 和 (1, 1),那么插值公式就可以化简为:

这种插值方法的结果通常不是线性的,线性插值的结果与插值的顺序无关。首先进行 y 方向的插值,然后进行 x 方向的插值,所得到的结果是一样的。

按照网上一些博客上写的,源图像和目标图像的原点(0,0)均选择左上角,然后根据插值公式计算目标图像每点像素,假设你需要将一幅5x5的图像缩小成3x3,那么源图像和目标图像各个像素之间的对应关系如下:

只画了一行,用做示意,从图中可以很明显的看到,如果选择右上角为原点(0,0),那么最右边和最下边的像素实际上并没有参与计算,而且目标图像的每个像素点计算出的灰度值也相对于源图像偏左偏上。

那么,让坐标加1或者选择右下角为原点怎么样呢?很不幸,还是一样的效果,不过这次得到的图像将偏右偏下。

最好的方法就是,两个图像的几何中心重合,并且目标图像的每个像素之间都是等间隔的,并且都和两边有一定的边距。

如果你不懂我上面说的什么,没关系,只要在计算对应坐标的时候改为以下公式即可,

int x=(i+0.5)*m/a-0.5

int y=(j+0.5)*n/b-0.5

代替

int x=i*m/a

int y=j*n/b

利用上述公式,将得到正确的双线性插值结果。

原始图像

双线性插值的锯齿边

双三次插值无锯齿边

具体双三次插值不做详细分析。在MATLAB下运算,双三次插值的速度明显比双线性插值慢很多。



版权所有权归卿萃科技 杭州FPGA事业部,转载请注明出处

作者:杭州卿萃科技ALIFPGA

原文地址:杭州卿萃科技FPGA极客空间 微信公众号



扫描二维码关注杭州卿萃科技FPGA极客空间




图像中的插值

时间: 2024-10-12 01:43:46

图像中的插值的相关文章

Halcon学习之六:获取Image图像中Region区域的特征参数

area_center_gray ( Regions, Image : : : Area, Row, Column )    计算Image图像中Region区域的面积Area和重心(Row,Column). cooc_feature_image ( Regions, Image : : LdGray, Direction : Energy,Correlation, Homogeneity, Contrast )   计算共生矩阵和推导出灰度特征值 Direction:灰度共生矩阵计算的方向  

matlab在图像中画长方形(框)

function [state,result]=draw_rect(data,pointAll,windSize,showOrNot) % 函数调用:[state,result]=draw_rect(data,pointAll,windSize,showOrNot) % 函数功能:在图像画个长方形框 % 函数输入:data为原始的大图,可为灰度图,可为彩色图 % pointAll 框的左上角在大图中的坐标(每行代表一个坐标), % 注意:在图中的坐标系为第一列为y,第二列为x(很奇怪的) % w

Matlab实现Hough变换检测图像中的直线

Hough变换的原理: 将图像从图像空间变换至参数空间,变换公式如下: 变换以后,图像空间与参数空间存在以下关系: 图像空间中的一点在参数空间是一条曲线,而图像空间共线的各点对应于参数空间交于一点的各条曲线. 下面使用Matlab实现Hough变换对图像中的直线划痕进行检测. close all; clear all; I = imread('scratch.tif'); figure; subplot(1,3,1); imshow(I); BW = edge(I,'canny');%Canny

BarCode Reader SDK使用教程:如何从图像中读取条码

我们知道很多语言都可以在windows平台上读取条码,今天将分享在BarCode Reader SDK中如何用VB.NET或者C#来读取图像中的条码. [BarCode Reader SDK下载] 这段代码演示了如何从图像中读取条码及打印到输出控制台. Visual Basic .NET: Imports System.IO Imports Bytescout.BarCodeReader ' requiring to install evaluation or full version of B

《OpenCV:访问Mat图像中每个像素值》

图像容器Mat 还是先看Mat的存储形式.Mat和Matlab里的数组格式有点像,但一般是二维向量,如果是灰度图,一般存放<uchar>类型:如果是RGB彩色图,存放<Vec3b>类型. 单通道灰度图数据存放格式: 多通道的图像中,每列并列存放通道数量的子列,如RGB三通道彩色图: 注意通道的顺序反转了:BGR.通常情况内存足够大的话图像的每一行是连续存放的,也就是在内存上图像的所有数据存放成一行,这中情况在访问时可以提供很大方便.可以用 isContinuous()函数来判断图像

利用matlab提取并分割RGB图像中的某一个已知像素值的图像

已知一副RGB图像中的的像素值,利用matlab将其分割出来并以二进制图像形式显示: %extract.m clear all; I=imread('new_original.png'); figure,imshow(I),title('Original Image'); bw=im2bw(I,0.3); %figure,imshow(bw),title('Gray Image'); rgb=[252,2,4]; img=extract_rgb(I,rgb); figure,imshow(im2

matlab 修改rbg图像中指定范围内像素点的rgb值

数组名是数组的首地址,就是数组中的第一个元素的地址,是常量.常量是不能值在=的左边的.数组和指针的区别在于,指针是变量,是用来存储指向数据的地址的变量,而数组名是常量.一般情况下申明一个数组,比如char  a[10]; 之后  数组名a都是数组的首地址,是一个地址常量.但是在函数申明的形参列表中除外,比如: int  fo(char []); 在这种情况下的申明与 int  fo(char a[]); int  fo(char *a); 是等价的,就是说在这种情况下,就算你写的是数组的形式,编

条形码读取控件Softek Barcode Reader Toolkit提取图像中条形码信息

Softek Barcode Reader Toolkit是一款功能强大的条形码读取控件,提取图像中条形码信息的综合工具包.可用在扫描.索引文件的应用程序中.条形码信息可高速准确地从文件中读取,无需介入操作,应用程序就可索引图像. 具体功能: 支持一维和二维条形码 shell(命令解析器)工具. C语言的API(应用程序接口). Perl(实用报表提取语言)模式. Java(TM)类. 图像消噪. 兼容常规的表达形式. 通过条形码的位置可分离多页的TIF文件. 支持彩色图像, 创建Code 39

访问图像中的像素[OpenCV 笔记16]

再更一发好久没更过的OpenCV,不过其实写到这个部分对计算机视觉算法有所了解的应该可以做到用什么查什么了,所以后面可能会更的慢一点吧,既然开了新坑,还是机器学习更有研究价值吧... 图像在内存中的存储方式 灰度图像 RGB图像,矩阵的列会包含多个子列 因为内存足够大,可以实现连续存储,因此,图像中的各行就能一行一行地连接起来,形成一个长行.连续存储,有助于提高图像扫面速度,可以使用isContinuous()来判断矩阵是否是连续存储. 颜色空间缩减 对于三通道图像,一个像素对应的颜色有一千六百