图像缩放之双线性插值
-
双线性插值
- 中文名
- 双线性插值
- 外文名
- Bilinear Interpolation
介绍
双线性插值,又称为双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。
示例
第一步:X方向的线性插值,插入蓝色 第二步 :做完X方向的插值后再做Y方向的
Y方向上插入绿色点P.
线性插值的结果与插值的顺序无关。首先进行y方向的插值,然后进行x方向的插值,所得到的结果是一样的。但双线性插值插值方法这种方法并不是线性的,首先进行y方向的插值,然后进行x方向的插值,与首先进行 x方向的插值,然后进行 y方向的插值,所得到的R1与R2是不一样的。
- 在x与y方向上,z值成单调性特性的应用中,此种方法可以做外插运算,即可以求解Q1~Q4所构成的正方形以外的点的值。
- 双线性插值的一个显然的三维空间延伸是三线性插值。
- 三线性插值的方法可参看matlab中的interp3
特点编辑
代码如下:
IplImage *img = cvLoadImage("C:\\Users\\Administrator\\Desktop\\3838.jpg");
int nw = img->width;
int nh = img->height;void Ctry::OnTryTyr1()
{//TODO: 在此添加命令处理程序代码 double times = 0.8; //比例因子 int nWidth =int( times * (img->width));int nHeight =int( times * (img->height));IplImage *dst = cvCreateImage(cvSize(nWidth, nHeight), 8, 3);CvScalar pixel1;for (int i = 0; i < dst->width; i++){for (int j = 0; j < dst->height; j++){if (int(i * 1 / times) < img->width && int(j * 1 / times) < img->height){pixel1 = InterpBilinear((i * 1 / times), (j * 1 / times ));cvSet2D(dst, j, i, pixel1);}else{cvSet2D(dst, j, i, RGB(0, 0, 0, ));}}}cvSaveImage("C:\\Users\\Administrator\\Desktop\\InterpBilinear.jpg", dst);cvNamedWindow(" dst", CV_WINDOW_AUTOSIZE);cvShowImage(" dst", dst);cvNamedWindow("img", CV_WINDOW_AUTOSIZE);cvShowImage("img", img);cvWaitKey(0);cvReleaseImage(&img);cvReleaseImage(&dst);cvDestroyWindow(" dst");cvDestroyWindow("img");
}CvScalar Ctry::InterpBilinear(double x, double y)
{//4个邻近点的坐标(i1,j1),(i2,j1),(i1,j2),(i2,j2)int x1, x2;int y1, y2;//4个最邻近像素值CvScalar f1, f2, f3, f4;//二个插值中间值CvScalar f12, f34;CvScalar pixel;double epsilon = 0.0001;//计算四个最邻近像素的坐标x1 = int(x);x2 = x1 + 1;y1 = int(y);y2 = y1 + 1;if ((x<0) || (x>nw - 1) || (y<0) || (y>nh - 1)){//要计算的点不在原图范围内MessageBox(NULL, "超过图片大小", "错误", MB_OK | MB_ICONERROR);return 0;}else{if (fabs(x - nw + 1 )<= epsilon){//要计算的点在图像的右边缘上if (fabs(y - nh + 1) <= epsilon){//要计算的元素恰好是图像最右下角的那一个元素,直接返回该点的像素值f1 = cvGet2D(img, y1, x1);return f1;}else{//在图像右边缘且不是最后一点,直接一次插值即可f1 = cvGet2D(img, y1, x1);f3 = cvGet2D(img, y1, x2);pixel.val[0] = f1.val[0] + (y - y1)*(f3.val[0] - f1.val[0]);pixel.val[1] = f1.val[1] + (y - y1)*(f3.val[1] - f1.val[1]);pixel.val[2] = f1.val[2] + (y - y1)*(f3.val[2] - f1.val[2]);return pixel;}}else if (fabs(y - nh + 1) <= epsilon){//要计算的点在图像的下边缘上且不是最后一点,直接一次插值即可f1 = cvGet2D(img, y1, x1);f2 = cvGet2D(img, y2, x1);pixel.val[0] = f1.val[0] + (x - x1)*(f2.val[0] - f1.val[0]);pixel.val[1] = f1.val[1] + (x - x1)*(f2.val[1] - f1.val[1]);pixel.val[2] = f1.val[2] + (x - x1)*(f2.val[2] - f1.val[2]);return pixel;}else{//计算4个最邻近像素值f1 = cvGet2D(img, y1, x1);f2 = cvGet2D(img, y2, x1);f3 = cvGet2D(img, y1, x2);f4 = cvGet2D(img, y2, x2);//插值1f12.val[0] = f1.val[0] + (x - x1)*(f2.val[0] - f1.val[0]);f12.val[1] = f1.val[1] + (x - x1)*(f2.val[1] - f1.val[1]);f12.val[2] = f1.val[2] + (x - x1)*(f2.val[2] - f1.val[2]);//插值2f34.val[0] = f3.val[0] + (x - x1)*(f4.val[0] - f3.val[0]);f34.val[1] = f3.val[1] + (x - x1)*(f4.val[1] - f3.val[1]);f34.val[2] = f3.val[2] + (x - x1)*(f4.val[2] - f3.val[2]);//插值3pixel.val[0] = f12.val[0] + (y - y1)*(f34.val[0] - f12.val[0]);pixel.val[1] = f12.val[1] + (y - y1)*(f34.val[1] - f12.val[1]);pixel.val[2] = f12.val[2] + (y - y1)*(f34.val[2] - f12.val[2]);return pixel;}}
}
效果图:
图像缩放之双线性插值相关推荐
- 双线性插值实现图像缩放详解
目录 双线性插值(Bilinear Interpolation) 线性插值 双线性插值 深入理解双线性插值 我的插值理解 代码 官方插值办法 源图像和目标图像几何中心的对齐 将浮点运算转换成整数运算 ...
- FPGA HLS双线性插值图像缩放视频拼接,上板验证稳定通过,提供3套工程源码和技术支持
目录 1.前言 2.HLS实现双线性插值图像缩放 3.vivado工程1:1080P缩小720P 4.vivado工程2:1080P缩小后mixer二分频 5.上板调试验证并演示 6.福利:工程代码的 ...
- OpenCV图像缩放插值之BiCubic双三次插值
图像缩放算法简介 在图像的仿射变换中,很多地方需要用到插值运算,常见的插值运算包括最邻近插值,双线性插值,双三次插值(立体插值),兰索思插值等方法,OpenCV提供了很多方法,其中,双线性插值由于折中 ...
- opencv3 图像处理(一)图像缩放( python与c++ 实现)
opencv3 图像处理 之 图像缩放( python与c++实现 ) 一. 主要函数介绍 1) 图像大小变换 Resize () 原型: void Resize(const CvArr* src,C ...
- OpenCV图像缩放resize各种插值方式的比较
OpenCV图像缩放resize各种插值方式的比较 目录 OpenCV图像缩放resize各种插值方式的比较 1. resize函数说明 2.各种插值方式的比较 2.1 INTER_NEAREST(最 ...
- 【图像缩放】双立方(三次)卷积插值
前言 图像处理中有三种常用的插值算法: 最邻近插值 双线性插值 双立方(三次卷积)插值 其中效果最好的是双立方(三次卷积)插值,本文介绍它的原理以及使用 如果想先看效果和源码,可以拉到最底部 本文的契 ...
- 图像缩放--OpenCV cvResize函数
void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR ); src 输入图像. dst 输出图 ...
- 实现基于最近邻内插和双线性内插的图像缩放C++实现
平时我们写图像处理的代码时,如果需要缩放图片,我们都是直接调用图像库的resize函数来完成图像的缩放.作为一个机器视觉或者图像处理算法的工作者,图像缩放代码的实现应该是必须掌握的.在众多图像缩放算法 ...
- python cv2.resize_Python OpenCV 图像缩放 cv2.resize 方法
今天是持续写作的第 42 / 100 天. 如果你有想要交流的想法.技术,欢迎在评论区留言. 本篇博客只学习一个方法,cv2.resize 即图像缩放. 取经之旅第 9 天 铺垫知识 resize 方 ...
- 【图像处理】图像灰度级减少, 图像缩放(Reducing the Number of Gray Levels, Zooming and Shrinking)
实验要求 (1.a) 编写一个以2 的幂次方将给定图像的灰度级数从256 减少到2 的程序.图像的灰度级数以参数变量的形式传递到所编写的程序中. (1.b) 使用图2.21(a) 以(1.a)中编写的 ...
最新文章
- golang etcd 报错 undefined: resolver.BuildOption 解决方案
- squid正反向代理-加快网站访问速度
- 将FeatClass属性表高效率转换成DataTable
- Spring mvc PostgreSQL 插入timestamp和int8
- 头条二面:你们公司怎么处理 MySQL 的 Binlog 日志?
- RabbitMQ 交换器、持久化
- 安全态势感知产品对比_设计中的对比和人的感知
- LeetCode 198 打家劫舍
- 《黑白团团》第九次团队作业:Beta冲刺与验收准备
- cad.net 读取pc3,pmp 读取pc3打印机文件
- 二级路由dhcp关闭连不上wifi_如何做到让家里WiFi真正全覆盖的几个布线方案
- 微信卡券开发错误自排查参考文档
- rescale matlab,frft_matlab integrated algorithm about Frft, matla - CodeBus
- 实验室设计规范与标准
- 就小容量分布式光伏电站信息采集系统的设计与应用的研究方案 光伏电站建设 小型光伏电站 (安科瑞-须静燕)
- openGL增强表面细节----法线贴图
- C# 网易云音乐API 多达100+ 支持登录,无损下载
- 深入探索 Android 网络优化(二、网络优化基础篇)上
- 微信服务器在哪里修改密码,微信修改密码在哪里 微信在哪里改密码
- 如何在APP中集成Google账户登录
热门文章
- 从金钱社会向财富第三极的过渡方案
- 【笔记】android应用签名
- 浅析总结 Java 内部类的一些使用与梳理
- POJ2187 Beauty Contest
- js基础-11-相等和全等的区别
- vue.js动态组件:is特性
- ie调试html代码,IE下的调试工具IE WebDeveloper
- 华为vrrp默认优先级_VRRP双主,真是要了我老命了
- php图片位置偏移代码,关于PHP的fseek()方法,究竟是什么偏移(位置)?
- android 原理 组合控件_Android组合控件实现功能强大的自定义控件