常见的插值方法有四种:最近邻插值法,双线性插值法,双三次插值法,LANCZOS插值法。主要应用场景为:几何变换,透视变换,计算新像素位置等。
一般来讲,图像进行缩放时,原始像素间的相对位置会发生改变,产生几何畸变。比如放大1.6倍,原像素就会向新像素进行映射,此时则会产生小数位的像素,然而像素是不能处理小数位的,所以需要通过插值法计算出新的整数位置的像素值。
常见插值方法介绍
- 最近邻插值法
顾名思义,就是把距离最近的点的像素值赋予变换后的像素点,简单并且速度快,最常见的默认算法。
- 双线性插值法
和最近邻不同的是,双线性插值法不仅考虑了最近的点,还将远处的点考虑进去了,分别背对两个方向进行一次线性插值,通过权值计算新像素点的像素值。通常用于信号处理和图像处理方面。
- 双三次插值法
双三次插值法也叫双立方插值法,比双线性插值法更复杂,会计算矩形网络周围最近的16个采样点,是一个三次多项式。虽然速度慢,但是图像平滑,具有抗锯齿功能。
- LANCZOS插值法
LANCZOS插值法是一种基于能量场的插值算法,会在新像素周围进行重采样,计算权值,并且通过低通滤波器进行样本之间的平滑。
MATLAB中插值法使用
MATLAB使用imresize进行图像尺寸变换,提供了三种插值方法:最近邻: nearest,双线性:bilinear,双三次:bicubic。
imresize调用格式:B = imresize(A,[numrows numcols],method);代码如下:
clear all;clc;img = imread('football.jpg'); %读入图像img1 = imresize(img, [160, 128]); % 设定为指定尺寸,第一个表示高,第二个表示宽,和相片尺寸正好相反。% 最近临插值img2 = imresize(img, 1.6, 'nearest');% 双线性插值img3 = imresize(img, 1.6, 'bilinear');% 双立方插值img4 = imresize(img, 1.6, 'bicubic');imshow(img);fihguresubplot(1,2,1); imshow(img1);subplot(1,2,2); imshow(img2);figure;subplot(1,2,1); imshow(img3);subplot(1,2,2); imshow(img4);
![3e061723444882aae4ffd5425de2591d.png](https://img-blog.csdnimg.cn/img_convert/3e061723444882aae4ffd5425de2591d.png)
原图像
![f7b040ebca3df4ec0a41797b73ad2ab7.png](https://img-blog.csdnimg.cn/img_convert/f7b040ebca3df4ec0a41797b73ad2ab7.png)
尺寸变换 和 最近临插值
![a4cbd96658c83ee31deff4a173b8105e.png](https://img-blog.csdnimg.cn/img_convert/a4cbd96658c83ee31deff4a173b8105e.png)
双线性插值 和 双三次插值
c++中插值法使用
c++中提供了四种插值方法,使用resize进行尺寸变换,具体实现如下:
#include#includeusing namespace cv;using namespace std;int main(int argc, char** argv) { Mat img = imread("data/images/football.jpg"); int h = img.rows; int w = img.cols; // 最近临插值只考虑最近的点 Mat img1 = Mat::zeros(img.size(), img.type()); resize(img, img1, Size(w * 1.6, h * 1.6), INTER_NEAREST); imshow("最近临插值