Opencv下双线性插值法进行图像放缩
关于图像放缩的算法有很多,本文主要介绍双线性插值法进行图像放缩,本文参考了: http://www.cnblogs.com/funny-world/p/3162003.html
我们设源图像src的大小为m*N,目标图像的大小为a*b。无论是放大还是缩小,我们所遵循的原则就是对于目标图像的像素点 f(i,j),我们在源图像当中找到其对应点 f(x,y)。
其算法为:i/x=m/a j/y=n/b 因此我们可以得到:x=i*(m/a) y=j*(n/b)
但是为了使放缩的效果更好,可以使两个图片的几何中心重合,所以我们可以:x=(i+0.5)*(m/a)-0.5 y=(j+0.5)*(n/b)-0.5
通过这样算法,我们便可以在源图像当中找到目标图像的对应点了,但是这样计算 x,y 很可能是float型,因此我们需要继续对 x,y进行处理

我们可以找到 于P(所求的点)最为临近的四个点 Q11 ,Q12 ,Q21,Q22 ,通过下面的算法进行处理:
f(R1)=(X2-X)/(X2-X1)*f(Q11)+(X-X1)/(X2-X1)*f(Q21)
f(R2)=(X2-X)/(X2-X1)*f(Q12)+(X-X1)/(X2-X1)*f(Q22)
f(i,j)=(Y2-Y)/(Y2-Y1)f(R1)+(Y-Y1)/(Y2-Y1)*f(R2)
通过这样的处理,我们便可以计算出目标图像法 f(i,j)的像素值了,从而可以求出目标图像.
下面是Opencv的代码:
#include<opencv2\opencv.hpp>
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp> using namespace std;
using namespace cv; int main(){
Mat src;
src=imread("G:/save1.jpg",); //输入图片;
if(src.empty()){
return -;
}
Mat dist=Mat((*src.rows),(*src.cols),CV_32FC3); //目标图片,将原图放大两倍; //遍历目标图片的点,将目标图片的归溯到原图的点当中,若结果为浮点型,则按照算法计算;
//归溯算法,原图大小为a*b,目标图大小m*n,i/x=a/m,j/y=b/n; float x,y;
int Q11[],Q21[],Q12[],Q22[]; //Q11 Q12 Q21 Q22分别对应着与P点最为临近的四个点,P点为目标图点还原到原图的点的对应位置;
float R1[],R2[];
for(int i=;i<dist.rows-;i++){ //这里减2是因为对于(src.rows-1,src.cols-1)的位置对应的是(dist.rows-2,dits.cols-2),再大一点就会超过内存。
for(int j=;j<dist.cols-;j++){
x=(i+0.5)*0.5-0.5; //通过加减0.5,将像素点移到中心点的位置,使放缩效果更好。
y=(j+0.5)*0.5-0.5; Q11[]=(int)x;
Q12[]=(int)x;
Q21[]=(int)x+;
Q22[]=(int)x+; Q11[]=(int) y;
Q21[]=(int) y;
Q12[]=(int) y+;
Q22[]=(int) y+; // 插值法算法如下:
// X1=(int)x; X2=(int)x+1; Y1=(int)y; Y2=(int)y+1;
// f(R1)=(X2-X)/(X2-X1)*f(Q11)+(X-X1)/(X2-X1)*f(Q21);
// f(R2)=(X2-X)/(X2-X1)*f(Q12)+(X-X1)/(X2-X1)*f(Q22);
// f(i,j)=(Y2-Y)/(Y2-Y1)f(R1)+(Y-Y1)/(Y2-Y1)*f(R2);
for(int m=;m<;m++){
R1[m]=((Q21[]-x)*src.at<Vec3b>(Q11[],Q11[])[m])+((x-Q11[])*src.at<Vec3b>(Q21[],Q21[])[m]);
R2[m]=((Q21[]-x)*src.at<Vec3b>(Q12[],Q12[])[m])+((x-Q11[])*src.at<Vec3b>(Q22[],Q22[])[m]);
dist.at<Vec3f>(i,j)[m]=(Q12[]-y)*R1[m]+(y-Q11[])*R2[m];
}
}
}
imwrite("G:/save.jpg",dist); //输出图片;
}
Opencv下双线性插值法进行图像放缩的更多相关文章
- 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析(转)
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/20537737 作者:毛星云(浅墨) ...
- OPENCV下SIFT算法使用方法笔记
这几天继续在看Lowe大神的SIFT神作,看的眼花手脚抽筋.也是醉了!!!!实在看不下去,来点干货.我们知道opencv下自带SIFT特征检测以及MATCH匹配的库,这些库完全可以让我们进行傻瓜似的操 ...
- 【opencv学习笔记六】图像的ROI区域选择与复制
图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...
- Python 图像处理 OpenCV (14):图像金字塔
前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...
- Python 图像处理 OpenCV (15):图像轮廓
前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...
- Python 图像处理 OpenCV (16):图像直方图
前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...
- Python图像处理丨基于OpenCV和像素处理的图像灰度化处理
摘要:本篇文章讲解图像灰度化处理的知识,结合OpenCV调用cv2.cvtColor()函数实现图像灰度操作,使用像素处理方法对图像进行灰度化处理. 本文分享自华为云社区<[Python图像处理 ...
- (原)使用opencv的warpAffine函数对图像进行旋转
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5070576.html 参考网址: http://stackoverflow.com/questions ...
- OpenCV成长之路:图像直方图的应用
OpenCV成长之路:图像直方图的应用 2014-04-11 13:57:03 标签:opencv 图像 直方图 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否 ...
随机推荐
- Spring 的Bean管理的常用注解
属性注入的注解(使用注解注入的方式,可以不用提供set方法) @Value 用于注入普通类型 @Autowired 自动装配 :默认按类型进行装配 按名称注入 @Qualifier 强制使用名称注入 ...
- RK3288][Android6.0] 调试笔记 --- 关闭按键音后无法录音问题【转】
本文转载自:http://blog.csdn.net/kris_fei/article/details/70052413 Platform: ROCKCHIPOS: Android 6.0Kernel ...
- T4 最小差异值 dvalue
T4 最小差异值 dvalue [问题描述] P 省刚经历一场不小的地震,所有城市之间的道路都损坏掉了,所以省长想请你将城市之间的道路重修一遍. 因为很多城市之间的地基都被地震破坏导致不能修公路了,所 ...
- [测试]单元测试框架NUnit
说到测试,相信大家都或多或少了解. 按照各自分类,就自己知道包括 A.单元测试.集成测试.系统测试 B.白盒测试.黑盒测试 C.压力测试.性能测试.安全测试 ...... 反正是太多太多.就做开发以来 ...
- HTTPS数据包抓取的可行性分析
HTTPS数据包抓取的可行性分析 相信只要是从事软件开发, 多多少少都会涉及到数据包的抓取.常见的有网页数据抓取(即网页爬虫),应用程序数据包抓取等.网页数据抓取比较简单, 在chrome下可以非常方 ...
- bzoj 2067 [ Poi 2004 ] SZN —— 二分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2067 问题1:贪心考虑,应该是每个点的儿子尽量两两配对,如果剩一个就和自己合并向上,所以 a ...
- 【转载】存储的一些基本概念(HBA,LUN)
1.关于HBA HBA的全称为Host Bus Adapter,即主机总线适配器. a.总线适配器是个什么东西呢? 我们首先要了解一下主机的结构,一台计算机内部多半由两条总线串在起来(当然实际情况会 ...
- 大神给你分析HTTPS和HTTP的区别(转)
http://www.php100.com/html/it/biancheng/2015/0209/8582.html 今天在做雅虎的时候,发现用第三方工具截取不到客户端与服务端的通讯,以前重来没碰到 ...
- C#实现的鼠标钩子
http://www.oschina.net/code/snippet_104607_45975 使用 Socket 获得网页内容,可以捕获错误页的内容 HttpClient http://www.o ...
- 常用的几个Dos命令-持续更新中
1.服务相关 (1).查看服务 C:\Windows\system32>net start 已经启动以下 Windows 服务: (2).启动服务 C:\Windows\system32> ...