图像插值算法

1. 最近邻插值算法

最近邻插值,是指将目标图像中的点,对应到源图像中后,找到最相邻的整数点,作为插值后的输出。

f(dstX,dstY)=h(dstXsrcWidthdstWidth,dstYsrcHeightdstHeight)\begin{array}{c} f(dst_{X}, dst_{Y}) = h(\frac{dst_{X}src_{Width}} {dst_{Width}}, \frac{dst_{Y}src_{Height}} {dst_{Height}}) \end{array} f(dstX​,dstY​)=h(dstWidth​dstX​srcWidth​​,dstHeight​dstY​srcHeight​​)​


如上图所示,目标图像中的某点投影到原图像中的位置为点P,此时易知,f(P)=f(Q11)f(P) = f(Q11)f(P)=f(Q11).

该方法的缺点: 作放大处理时,在图象中可能出现明显的块状效应

2.双线性插值

线性插值

线性插值的表达式为;
f(x)=a1x+a0f(x)=a_{1} x+a_{0} f(x)=a1​x+a0​


如上图坐标系可以得到新的坐标(X,Y)
y=y0+(x−x0)y1−y0x1−x0=y0+(x−x0)y1−(x−x0)y0x1−x0y=y_{0}+\left(x-x_{0}\right) \frac{y_{1}-y_{0}}{x_{1}-x_{0}}=y_{0}+\frac{\left(x-x_{0}\right) y_{1}-\left(x-x_{0}\right) y_{0}}{x_{1}-x_{0}} y=y0​+(x−x0​)x1​−x0​y1​−y0​​=y0​+x1​−x0​(x−x0​)y1​−(x−x0​)y0​​

双线性插值

双线性插值就是线性插值在二维时的推广,在两个方向上做三次线性插值,具体操作如下图所示:

令f(x,y)f(x,y)f(x,y)为两个变量的函数,其在单位正方形顶点的值已知。假设我们希望通过插值得到正方形内任意点的函数值。则可由双线性方程: f(x,y)=ax+by+cxy+df(x, y)=a x+b y+c x y+d f(x,y)=ax+by+cxy+d

来定义的一个双曲抛物面与四个已知点拟合。

首先对上端的两个顶点进行线性插值得:

f(x,0)=f(0,0)+x[f(1,0)−f(0,0)]f(x, 0)=f(0,0)+x[f(1,0)-f(0,0)] f(x,0)=f(0,0)+x[f(1,0)−f(0,0)]

类似地,再对底端的两个顶点进行线性插值有: f(x,1)=f(0,1)+x[f(1,1)−f(0,1)]f(x, 1)=f(0,1)+x[f(1,1)-f(0,1)] f(x,1)=f(0,1)+x[f(1,1)−f(0,1)]

最后,做垂直方向的线性插值,以确定:

f(x,y)=f(x,0)+y[f(x,1)−f(x,0)]f(x, y)=f(x, 0)+y[f(x, 1)-f(x, 0)] f(x,y)=f(x,0)+y[f(x,1)−f(x,0)]

整理得:

f(x,y)=[f(1,0)−f(0,0)]x+[f(0,1)−f(0,0)]y+[f(1,1)+f(0,0)−f(0,1)−f(1,0)]xy+f(0,0)\begin{array}{l} f(x, y)=[f(1,0)-f(0,0)] x+[f(0,1)-f(0,0)] y \ +[f(1,1)+f(0,0)-f(0,1)-f(1,0)] x y+f(0,0) \end{array} f(x,y)=[f(1,0)−f(0,0)]x+[f(0,1)−f(0,0)]y +[f(1,1)+f(0,0)−f(0,1)−f(1,0)]xy+f(0,0)​

3.映射方法

向前映射法

可以将几何运算想象成一次一个象素地转移到输出图象中。如果一个输入象素被映射到四个输出象素之间的位置,则其灰度值就按插值算法在4个输出象素之间进行分配。称为向前映射法,或象素移交影射。

注:从原图象坐标计算出目标图象坐标镜像、平移变换使用这种计算方法
向后映射法

向后映射法(或象素填充算法)是输出象素一次一个地映射回到输入象素中,以便确定其灰度级。如果一个输出象素被映射到4个输入象素之间,则其灰度值插值决定,向后空间变换是向前变换的逆。

注:从结果图象的坐标计算原图象的坐标

4.代码实现(C++)

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main(int argc, char* argv[])
{Mat img = imread("D:/image/yuner.jpg");if (img.empty()){cout << "无法读取图像" << endl;return 0;}int height = img.rows;int width = img.cols;// 缩小图像,比例为(0.2, 0.2)Size dsize = Size(round(0.2 * width), round(0.2 * height));Mat shrink;//使用双线性插值resize(img, shrink, dsize, 0, 0, INTER_LINEAR);// 在缩小图像的基础上,放大图像,比例为(1.5, 1.5)float fx = 1.5;float fy = 1.5;Mat enlarge1, enlarge2;resize(shrink, enlarge1, Size(), fx, fy, INTER_NEAREST);resize(shrink, enlarge2, Size(), fx, fy, INTER_LINEAR);// 显示imshow("src", img);imshow("shrink", shrink);imshow("INTER_NEAREST", enlarge1);imshow("INTER_LINEAR", enlarge2);waitKey(0);return 0;
}

计算机视觉基础:图像处理Task01-图像插值算法相关推荐

  1. 计算机视觉基础-图像处理(图像滤波)cpp+python

    4.1 简介 图像的实质是一种二维信号,滤波是信号处理中的一个重要概念.在图像处理中,滤波是一种非常常见的技术,它们的原理非常简单,但是其思想却十分值得借鉴,滤波是很多图像算法的前置步骤或基础,掌握图 ...

  2. Datawhale 计算机视觉基础-图像处理(上)-Task01 OpenCV框架与图像插值算法

    简介 在图像处理中,平移变换.旋转变换以及放缩变换是一些基础且常用的操作.这些几何变换并不改变图象的象素值,只是在图象平面上进行象素的重新排列.在一幅输入图象 [ u , v ] [u,v] [u,v ...

  3. 计算机视觉基础---图像处理(几何变换)cpp+python

    2.1 简介 该部分将对基本的几何变换进行学习,几何变换的原理大多都是相似,只是变换矩阵不同,因此,我们以最常用的平移和旋转为例进行学习.在深度学习领域,我们常用平移.旋转.镜像等操作进行数据增广:在 ...

  4. 计算机视觉基础-图像处理-几何变换

    本文来源于Datawhale组队学习的教材手册,供大家参考阅读. https://github.com/datawhalechina/team-learning/blob/master/%E8%AE% ...

  5. lbp特征提取算法 知乎_计算机视觉基础-图像处理: LBP特征描述算子

    1 简介 LBP指局部二值模式(Local Binary Pattern),是一种用来描述图像局部特征的算子,具有灰度不变性和旋转不变性等显著优点.LBP常应用于人脸识别和目标检测中,在OpenCV中 ...

  6. 计算机视觉基础-图像处理(边缘检测)cpp+python

    6.1 简介 6.1.1 什么是边缘? 边缘是图像强度函数快速变化的地方 6.1.2 如何检测边缘? 为了检测边缘,我们需要检测图像中的不连续性,可以使用导数来检测不连续性. 如上图所示,上图的第一幅 ...

  7. 计算机视觉基础-图像处理(图像分割/二值化)cpp+python

    5.1 简介 该部分的学习内容是对经典的阈值分割算法进行回顾,图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单.计算量小.性能较稳定而成为图像分割中最基本和应用最广泛的分割技术.它特别适用 ...

  8. 计算机视觉基础——图像处理(彩色空间互转)cpp+python

    3.1 简介 图像彩色空间互转在图像处理中应用非常广泛,而且很多算法只对灰度图有效:另外,相比RGB,其他颜色空间(比如HSV.HSI)更具可分离性和可操作性,所以很多图像算法需要将图像从RGB转为其 ...

  9. 计算机视觉基础-图像处理 Task06 边缘检测

    文章目录 Sobel算子 Canny边缘检测 1.高斯滤波 2.计算梯度强度和方向 3.非极大值抑制 4.用双阈值算法检测和连接边缘 函数实现 Sobel算子 Canny算法 Sobel算子 我们可以 ...

  10. 计算机视觉基础-图像处理 Task05 图像分割/二值化

    文章目录 OSTU二值化 自适应阈值 函数实现 OSTU二值化 自适应阈值 图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单.计算量小.性能较稳定而成为图像分割中最基本和应用最广泛的分割技 ...

最新文章

  1. 如何评价小马智行投后估值60亿美元?无人车的追涨杀跌已经开始
  2. 【深度学习】如何将Voting和Stacking等应用到神经网络模型
  3. python零基础能学吗 知乎-如何零基础入门 Python?
  4. kickstart 为 rhel5 创建 ext4 分区
  5. vim环境设置和自动对齐
  6. 机器学习面试题之LR
  7. HDU4565(SummerTrainingDay05-C 矩阵快速幂)
  8. 【2020】【论文笔记】相变材料与超表面——
  9. web service压测工具:siege安装及使用介绍
  10. RuntimeWarning: invalid value encountered in arccos
  11. 《小5自我推荐资源 | 寻找C站“宝藏》
  12. 计算机随机数字excel,excel怎么生成随机数字 excel随机数字区间怎么设定
  13. 【写给初发论文的人】撰写综述性科技论文常见问题
  14. [深度学习概念]·声纹识别技术简介
  15. 沪江手操:让你的双手更灵活,手部锻炼五法
  16. Linux 系统设置 : dmesg 命令详解
  17. ERP系统一般业务流程
  18. SpringMVC学习系列(5) 之 数据验证
  19. c#下BLE蓝牙通信
  20. 使用现代C++如何避免bugs(上)

热门文章

  1. windows 10 64位安装Python3.6.4
  2. B站,N站,汤站,爬虫下载资源总结与技巧(一)
  3. MyBatis 使用
  4. 如何看待基于OpenStack与Docker技术的云计算建设
  5. ×××的虚拟专用网--gre
  6. 【转贴】Oracle查询重复数据与删除重复记录方法
  7. 宽带ADSL安装过程的18个问答
  8. mysql binlog 断点续传_mysql5.6 binlog实时异地备份之我见犹怜
  9. python调用yolov3模型,pytorch版yolov3训练自己的数据(数据,代码,预训练模型下载链接)...
  10. 天 月_财务结算专业术语快来学习!月结和月结30天的区别