双线性插值算法c 语言实现,实现opencv中常用的三种插值算法

本文介绍了图像处理中常见的三种插值算法:最近邻域、双线性和双三次插值,并提供了C++实现。通过插值,可以在图像缩放时增加像素点,提高图像分辨率。代码包括了欧式距离计算、插值公式及权重系数的求解等关键步骤。
摘要由CSDN通过智能技术生成

很长时间不敲代码,感觉一闲下来就忘了很多。想着把一些图像算法自己实现一遍也好,一方面加深算法的学习和理解,另一方面又可以练练编码能力。对于我这个非科班出身的,也挺有好处的。

不管那么多,先把这个坑挖了。闲着想敲代码了就慢慢填。

下面先把图像处理中常见的三种插值算法实现了。先解释一下什么叫插值。老样子先看看维基百科怎么解释。

数学的数值分析领域中,内插或称插值(英语:interpolation)是一种通过已知的、离散的数据点,在范围内推求新数据点的过程或方法。

8118e708b766

450px-Splined_epitrochoid.svg.png

一组离散数据点在一个外延的插值。曲线中实际已知数据点是红色的;连接它们的蓝色曲线即为插值。

再举个例子:

x1 = 1, y1 = 3

x2 = 3, y2 = 7

x3 = 5, y3 = 24

求x = 4时, y = ?

所以可以看到,可以这么理解插值,在一个函数里面,自变量是离散有间隔的,插值就是往自变量的间隔之间插入新的自变量,然后求解新的自变量函数值。这有什么作用呢,从上图可以看到,散点图是可以利用插值来拟合曲线的,蓝色的就是插入的密密麻麻的点。

然而在图像处理上的应用可以体现在图像的缩放上面。如放大一张图片,在像素点的层面上其实就是往像素点之间插入新的像素点从而增大图像的分辨率。

插值算法有很多种,具体可以参考维基百科插值

这里就实现图像处理比较常用的三种:最近邻域差值、双线性插值、双三次插值

最近邻域插值

最近邻域内插法(Nearest Neighbor interpolation)

最近邻域是三种插值之中最简单的一种,原理就是选取距离插入的像素点(x+u, y+v)【注:x,y为整数, u,v为小数】最近的一个像素点,用它的像素点的灰度值代替插入的像素点。说到距离,顺便复习一下像素点之间的三种空间距离。

对于像素p、q和z,分别具有坐标(x,y),(s,t)和(u,v),如果

(1) D(p,q) ≥ 0 (当且仅当p=q时,D(p,q)=0)

(2) D(p,q) = D(q,p)

(3) D(p,z) ≤ D(p,q) + D(q,z)

则称D是距离函数或度量

8118e708b766

欧氏距离.gif

D4距离(城市距离)

8118e708b766

D4距离.gif

D8距离(棋盘距离)

8118e708b766

D8距离.gif

这里代码实现采用的是欧式距离

//最近邻域插值

//根据目标图像的像素点(浮点坐标)找到原始图像中的4个像素点,取距离该像素点最近的一个原始像素值作为该点的值。

#include

#include

namespace mycv {

void nearestIntertoplation(cv::Mat& src, cv::Mat& dst, const int rows, const int cols);

}//mycv

double distance(const double x1, const double y1, const double x2, const double y2);//两点之间距离,这里用欧式距离

int main()

{

cv::Mat img = cv::imread("lena.jpg", 0);

if (img.empty()) return -1;

cv::Mat dst;

mycv::nearestIntertoplation(img, dst, 600, 600);

cv::imshow("img", img);

cv::imshow("dst", dst);

cv::waitKey(0);

return 0;

return 0;

}//main

void mycv::nearestIntertoplation(cv::Mat& src, cv::Mat& dst, const int rows, const int cols)

{

//比例尺

const double scale_row = static_cast(src.rows) / rows;

const double scale_col = static_cast(src.rows) / cols;

//扩展src到dst

dst = cv::Mat(rows, cols, src.type());

assert(src.channels() == 1 && dst.channels() == 1);</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值