opencv中提供了3个将浮点数转换为整数的方法;

cvRound()函数返回和参数最接近的整数值;

cvFloor()返回不大于参数的最大整数值;

cvCeil()返回小于参数的最小整数值;

1. 最近邻插值

关键点事找到缩放倍数,然后邻域向上取整完成坐标映射;

cv::Mat nNeighbourInterpolation(cv::Mat srcImage)
{CV_Assert(srcImage.data != NULL);int rows = srcImage.rows;int cols = srcImage.cols;//构建目标图像cv::Mat dstImage = cv::Mat(cv::Size(150,150), srcImage.type(), cv::Scalar::all(0));int dstRows = dstImage.rows;int dstCols = dstImage.cols;//坐标转换,求取缩放倍数float cx = (float)cols / dstCols;float ry = (float)rows / dstRows;//遍历图像,完成缩放操作for(int i = 0; i < dstCols; i++){int ix = cvFloor(i * cx);for(int j = 0; j < dstRows; j++){int jy = cvFloor(j * ry);//边界处理if(ix > cols -1)ix = cols - 1;if(jy > rows - 1)jy = rows - 1;//映射矩阵dstImage.at<cv::Vec3b>(j, i) = srcImage.at<Vec3b>(jy, ix);}}return dstImage;
}

2. 双线性插值

3. resize()函数实现图像大小变换

函数原型如下:

/*实现图像尺寸大小变换功能;_src:源图像          _dst:目的图像        dsize:输出图像的尺寸,若为0,尺寸将被计算为Size(round(fx*src.cols),round(fy*src.rows));inv_scale_x:水平缩放因子;       inv_scale_y:垂直缩放因子; interpolation:插值方法;
*/
void cv::resize( InputArray _src, OutputArray _dst, Size dsize,double inv_scale_x, double inv_scale_y, int interpolation )

提供了5中插值方法:最近邻,双线性,像素区域,立方插值,兰索斯插值;

void ResizeExample(cv::Mat srcImage)
{CV_Assert(srcImage.data != NULL);cv::Mat dstImage(256,256,CV_8UC3);//默认参数为双线性插值double tTime;tTime = (double)getTickCount();const int nTimes = 100;for(int i = 0 ;i < nTimes ; i++){resize(srcImage,dstImage,Size(dstImage.rows,dstImage.cols),0,0);}tTime = 1000 * ((double)getTickCount() - tTime) / getTickFrequency();tTime /= nTimes;std::cout << "test1 = " << tTime << endl;cv::imwrite("./lena_resize1.jpg", dstImage);//最近邻插值tTime = (double)getTickCount();for(int i = 0 ;i < nTimes ; i++){resize(srcImage,dstImage,Size(dstImage.rows,dstImage.cols),0,0,cv::INTER_NEAREST);}tTime = 1000 * ((double)getTickCount() - tTime) / getTickFrequency();tTime /= nTimes;std::cout << "test2 = " << tTime << endl;cv::imwrite("./lena_resize2.jpg", dstImage);   //像素区域插值tTime = (double)getTickCount();for(int i = 0 ;i < nTimes ; i++){resize(srcImage,dstImage,Size(dstImage.rows,dstImage.cols),0.5,0.5,cv::INTER_AREA);}tTime = 1000 * ((double)getTickCount() - tTime) / getTickFrequency();tTime /= nTimes;std::cout << "test3 = " << tTime << endl;cv::imwrite("./lena_resize3.jpg", dstImage);  //立方插值tTime = (double)getTickCount();for(int i = 0 ;i < nTimes ; i++){resize(srcImage,dstImage,Size(dstImage.rows,dstImage.cols),0.5,0.5,cv::INTER_CUBIC);}tTime = 1000 * ((double)getTickCount() - tTime) / getTickFrequency();tTime /= nTimes;std::cout << "test4 = " << tTime << endl;cv::imwrite("./lena_resize4.jpg", dstImage);//兰索斯插值tTime = (double)getTickCount();for(int i = 0 ;i < nTimes ; i++){resize(srcImage,dstImage,Size(dstImage.rows,dstImage.cols),0.5,0.5,cv::INTER_LANCZOS4);}tTime = 1000 * ((double)getTickCount() - tTime) / getTickFrequency();tTime /= nTimes;std::cout << "test5 = " << tTime << endl;cv::imwrite("./lena_resize5.jpg", dstImage);  /*test1 = 0.076032test2 = 0.0625323test3 = 0.103261test4 = 1.16022test5 = 2.11283*/
}

4. 图像金字塔

向下采样采用的是高斯金字塔,向上重建技术采用拉普拉斯金字塔;

void cv::pyrDown( InputArray _src, OutputArray _dst, const Size& _dsz, int borderType )

void cv::pyrUp( InputArray _src, OutputArray _dst, const Size& _dsz, int borderType )

int main()
{   cv::Mat srcImage = cv::imread("./lena.jpg");if(srcImage.empty()){std::cout << "imread failed" << endl;return -1;}//下采样cv::Mat dstImage;pyrDown(srcImage, dstImage, Size(srcImage.rows/2,srcImage.cols/2));//上采样,对下采样进行重构;cv::Mat buildImage;pyrUp(dstImage, buildImage, Size(dstImage.rows*2,dstImage.cols*2));//源图像与重构图像作差cv::Mat diffImage;cv::absdiff(srcImage, buildImage, diffImage);cv::imwrite("./lena_diff.jpg", diffImage);return  0;
}

opencv之图像采样相关推荐

  1. Python 计算机视觉(六)—— OpenCV 进行图像量化与采样

    对于信号的采样可以参考我之前的文章:数字信号处理 2.1 - 采样 对于信号的量化可以参考:数字信号处理 2.4 - ADC 中的有限字长效应 在本篇文章中绘图使用到了 matplotlib 库,需要 ...

  2. 使用Python、OpenCV进行图像接缝雕刻

    使用Python.OpenCV进行图像接缝雕刻 1. 效果图 2. 原理 3. 安装--鉴于算法的专利原因,0.16以上版本均去掉了接缝雕刻算法: 4. 源码 参考 这篇博客将介绍基于图像内容感知调整 ...

  3. 使用Python和OpenCV构建图像金字塔

    使用Python和OpenCV的图像金字塔 1. 效果图 2. 什么是图像金字塔? 3. 依赖 4. 源码 参考 这篇博客将介绍如何使用两种方法构造图像金字塔. 使用Python和OpenCV构建金字 ...

  4. [Python从零到壹] 四十一.图像处理基础篇之图像采样处理

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  5. opencv 创建图像_非艺术家的图像创建(OpenCV项目演练)

    opencv 创建图像 This project stemmed from my predilection of the visual arts - as a computing student, I ...

  6. opencv实现图像的边缘提取

    实验一 边缘提取 一. 实验目的 利用opencv编写实现下图的边缘提取 二.实验内容 利用opencv python实现边缘提取 (1)在python安装opencv库 如果安装了python,直接 ...

  7. opencv及图像基本处理

    图像处理 学习目标 了解图像的起源 知道数字图像的表示 1 图像的起源 1.1 图像是什么 图像是人类视觉的基础,是自然景物的客观反映,是人类认识世界和人类本身的重要源泉."图"是 ...

  8. OpenCV基础(3)使用OpenCV调整图像大小

    让我们学习如何使用OpenCV调整图像大小.要调整图像的大小,请根据指定的比例因素或设置所需的高度和宽度,沿着每个轴(高度和宽度)缩放图像. 当调整图像大小: 如果你想在调整后的图像中保持相同的大小, ...

  9. 6.openCV调整图像大小新思路(cv2.resize和imutils.resize)

    6.opencv调整图像大小的新方法imutils.resize 一.openCV 调整图像大小 ( cv2.resize ) 二.项目结构和代码讲解 1.项目结构 2.代码讲解 3.比较 OpenC ...

最新文章

  1. Matlab数据的可视化 -- 平面多边形的着色
  2. 小白也能看懂的Matplotlib简明教程
  3. 慕尼黑工业大学最新综述:深度神经网络中的不确定性
  4. unipapp 解决无法编译sass_Sass教程一:Sass概况
  5. MySQL子查询操作实例详解
  6. 使用Spring Webservices构建SOAP Webservices代理模块
  7. 5G还没来,我的4G网速就变慢了!运营商到底有没有说实话?
  8. java day45【JQuery 高级:动画,遍历,事件绑定,案例,插件】
  9. 001.DIV 标签添加滚动条
  10. 高等数学第六版下册答案
  11. 在无线网中,通过添加IP地址连接东芝打印机
  12. Matlab中_pkg.exe,windows系统如何打开pkg|windows打开pkg文件包的方法
  13. Win10 微软拼音添加小鹤双拼以及其他配置
  14. rho是什么 matlab,RHO值是什么?如何理解RHO值?
  15. 我精心整理的一些大牌男装正品店
  16. 模块化笔记软件综合评测:Craft、Notion、FlowUs
  17. yolov5篇---官方代码docker部署训练
  18. Base64 加密解密图片
  19. 瑞幸咖啡完成债务重组:陆正耀出局 股东大钲资本成实控方
  20. 汤晓丹的第四版计算机操作系统--第五章总结概述

热门文章

  1. 尚硅谷2020最新版宋红康JVM教程更新至中篇(java虚拟机详解,jvm从入门到精通)
  2. Mac Homebrew 安装与卸载
  3. 量子链Qtum ERC20 兑换为主网络币的公告
  4. android 流量统计换算,什么是流量?如何计算流量?流量的单位如何换算
  5. 思科笔记-One 什么是ip地址,ip地址分类和范围,网络手机流量单位换算
  6. 当客户说“贵”时,你该怎么办?
  7. 使用Typora实现自动编号
  8. 如何mysql数据库输出为jone_我们可以通过单个MySQL查询获得记录“ Jone Deo”或“ Deo Jone”吗?...
  9. 搭建Paas-------单节点安装Docker
  10. 读书笔记 - The Hitchhiker's Guide to Python