当前位置: 首页 > news >正文

OpenCV第六讲: 漫水填充、图像金字塔

OpenCV第六讲: 漫水填充、图像金字塔

1. 漫水填充

对连续的像素区域进行处理。

  1. 是一种用特定的颜色填充连通区域,通过设置可联通像素的上下限以及连通方式来达到不同的填充效果的方法。

  2. 经常被用来标记或分离图像的一部分;

  3. 可以用来从输入图像中获取掩码区域,掩码会加速处理过程。

2. 源代码剖析

  • OpenCV函数实现 – floodFill

    漫水填充操作的结果总是某个连续的区域,当邻近像素点位于给定的范围内,或者在指定点像素值范围内,函数都会为起涂上颜色。

	/********************************************************************
		* 漫水填充:
		* int floodFill( InputOutputArray image,
		*                       Point seedPoint, Scalar newVal, CV_OUT Rect* rect = 0,
		*                        Scalar loDiff = Scalar(), Scalar upDiff = Scalar(),
		*                        int flags = 4 );
		* 
		* @param newVal; New value of the repainted domain pixels.
		*
		* @param loDiff; Maximal lower brightness/color difference between the currently observed pixel and
		*			one of its neighbors belonging to the component, 
		*			or a seed pixel being added to the component.
		*		最小色差
	    * @param upDiff; Maximal upper brightness/color difference between the currently observed pixel and
		*			one of its neighbors belonging to the component, 
		*			or a seed pixel being added to the component.
		* 	最大色差
		* *********************************************************************************/
		Mat fillImage;
		srcImage.copyTo(fillImage);
		Rect tmp;
		floodFill(fillImage, Point(50, 10), Scalar(155,255,255), &tmp, Scalar(5, 5, 5), Scalar(10, 10, 10));
		imshow("floodFill", fillImage);
  • 测试结果

3. 图像金字塔与图片尺寸缩放

  • resize函数 与pyrUp() pyrDown()函数

    都是对图像进行放大和缩小。pyrUp() pyrDown()是对图像进行向上和向下采样。

		resize --> OpenCV--imgproc--Image Filtering
		pyrUp+pyrDown -->OpenCV--imgproc--Geometric Image Transformations

		   /********************************************************************
		  * resize():
		  * void resize( InputArray src, OutputArray dst,
		  *                        Size dsize, double fx = 0, double fy = 0,
		  *                        int interpolation = INTER_LINEAR );
		  *
		  * enum InterpolationFlags{
		    INTER_NEAREST        = 0,	// 最邻近插值
		    INTER_LINEAR         = 1,	// 线性插值  (放大图像)
		    INTER_CUBIC          = 2,	// 三次样条插值 
		    INTER_AREA           = 3,	// 区域插值	(缩小图像)
		    INTER_LANCZOS4       = 4,	// lanczos 插值
			};
			*******************************************************************/

4. 重读图像金子塔

图像金字塔是图像多尺度、多分辨的一种表达方式,主要应用与图像分割。 一般一副图像的金字塔是一系列以金字塔形状排列的,分辨率逐步降低且来源于同一张原始图像的图像集合

金字塔的底部是待处理图像的高分辨率表示(原始图像),而顶部是分辨率降低的图像。简单的说,我们就是将一层一层分辨率降低的图像比喻成金字塔,金字塔越高,分辨率越低。

常用的两种图像金字塔

  • 高斯金字塔

    用来向下采样,即降低分辨率, 为主要的图像金字塔;

 		"对图像向下取样"
 		1>	对原图像进行高斯内核卷积;
 		2>	将所有偶数行和列去除;
 		结果:新的图像只有原图的1/4, 这样丢失了图像的部分信息,即缩小了图像;
 		
 		"对图像向上取样"
 		1>	将图像在每个方向上扩大原来的两倍, 新增的行和列以`0填充`;
 		2>	使用先前同样的内核(乘以4)与放大后的图像卷积,获得“新增像素”的近似值;
 		结果:放大了图像,但与原图像相比会比较模糊,(丢失的数据无法补偿)。
 		`要想补偿数据,减少缺失的信息就需要用到拉普拉斯金字塔。`
  • 拉普拉斯金字塔

    用来向上复原,可以对图像进行最大程度的还原,配合高斯金字塔一起使用;

    拉普拉斯金字塔的来源可表示为:
    	源图像 - 放大(缩小源图像) = 拉普拉斯结果
    

这里的向上和向下不是针对图像堆积而成的外形金字塔而言的,而是数学意义上的向下采样,向上采样(为了区别,这里我改了一种说法,变成向上复原), 表达的意思是一致的。

外形金字塔

外形金字塔示意图
  • 图像金字塔的一个重要应用 – 图像分割

    先建立一个图像金字塔,然后对不同层的图像像素按照对应的关系建立起“父”与“子”关系;

    快速初始分割可以现在金字塔高层的低分辨率图像上完成,然后逐层对分割加以优化。

  • pyrUp函数 – 向上采样 // pyrDown函数 – 向下采样

    这里的向上、向下是数学意义上的向上、向下, 也可以说是针对图像的尺寸而言的,而不是外形金字塔。也就是说,这里的向下,就是分辨率降低,图像尺寸减小; 这里的向上,就是分辨率提高,图像尺寸增大

  • 源代码剖析

 		/****************************************************************************************
		  * 图像金字塔:
		  * pyrUp(): 进行向上取样操作, 放大图像, 图像变模糊了;
		  * pyrDown(); 进行向下取样操作, 降低了图像分辨率, 缩小了图像, 图像一样变模糊了;
		  
		  ************************************************************************/

在这里插入图片描述

相关文章:

  • OpenCV第七讲:阈值的作用
  • OpenCV第八讲:图像变换之边缘检测(Canny+Sobel算子)
  • V-SLAM 回环检测与后端优化重读
  • OpenCV第九讲:图像变换之边缘检测(Laplacian +Scharr 算子)
  • OpenCV第十讲:图像几何形状识别之霍夫变换
  • OpenCV 第十一讲: 重映射、仿射变换、直方图均衡化
  • OpenCV第十二讲:角点检测与亚像素精度
  • OpenCV第十三讲:SURF特征点的检测与匹配详解
  • OpenCV第十四讲: Fast特征点与ORB特征点原理详解
  • DAVIS第一课: 事件相机的工作原理和相关核心功能简介
  • DAVIS第二课:基于事件相机的视觉里程计
  • Rtab-Map学习之rtabmap_ros源代码剖析
  • DAVIS前言:事件相机资料调研
  • DAVIS第三课: 基于事件相机的光流法计算
  • CUDA学习第一天: 基础概念扫盲
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Consul Config 使用Git做版本控制的实现
  • JavaScript设计模式之工厂模式
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 从PHP迁移至Golang - 基础篇
  • 服务器之间,相同帐号,实现免密钥登录
  • 京东美团研发面经
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 原生 js 实现移动端 Touch 滑动反弹
  • ionic入门之数据绑定显示-1
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​第20课 在Android Native开发中加入新的C++类
  • ​批处理文件中的errorlevel用法
  • # Java NIO(一)FileChannel
  • #100天计划# 2013年9月29日
  • #NOIP 2014# day.1 T2 联合权值
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (5)STL算法之复制
  • (java)关于Thread的挂起和恢复
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (翻译)terry crowley: 写给程序员
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转载)Linux网络编程入门
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET Core跨平台微服务学习资源
  • .net MySql
  • .NET 回调、接口回调、 委托
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • [<事务专题>]
  • [BUG]vscode插件live server无法自动打开浏览器
  • [c#基础]值类型和引用类型的Equals,==的区别