接opencv6.1-imgproc图像处理模块之平滑和形态学操作,顺带说一句在opencv中的in-place操作就是比如函数的输入图像和输出图像两个指针是相同的,那么就是in-place操作了。比如很多函数支持目标图像和原图像是同一个内存区域。

三、图像的失真缩放

采用 pyrUp 和 pyrDown 对图像进行向上和向下采样来达到图像放大和缩小的目的。在这其中的操作是失真操作,所以放大的时候会模糊很多。在这里顺带补上opencv中真正的缩放函数resize()。

这两个函数又叫做上采样和下采样,其实在http://blog.csdn.net/shouhuxianjian/article/details/40888715 中这个CNN的训练过程中就有这两个概念,这就像是金字塔一样:

如上图所示,顶层为原始大小的图像,那么往下就叫做下采样,会使得图像越来越小;反之如果底层为原始大小图像,那么往上就叫做上采样,会使得图像越来越大。一般来说,有两种类型的图像金字塔常常出现在文献和应用中:

a、高斯金字塔(Gaussian pyramid): 用来向下采样

b、拉普拉斯金字塔(Laplacian pyramid): 用来从金字塔低层图像重建上层未采样图像。

在这篇文档中我们将使用 高斯金字塔 :

G_(i)和G_(i+1)表示从上往下相邻的两幅图。我们得到了G_(i)的图,如何采用高斯金字塔得到下层更小的图呢?

1、将 G_(i)与高斯内核卷积:

2、将偶数行和列删除。

pyrDown( src, dst, Size( src.cols/2, src.rows/2 ) );//采用的就是上面的原理

函数原型为:void pyrDown(InputArray src, OutputArray dst, const Size& dstsize=Size(), int borderType=BORDER_DEFAULT);

前两个参数就不介绍了;第三个参数表示的是输出图像的大小,默认的就是Size((src.cols+1)/2, (src.rows+1)/2)。不过在任何情况下,都受约束:

|dstsize.width * 2 - src.cols| ≤ 2

|dstsize.height * 2 - src.rows| ≤ 2

那么这样就得到原始图像的1/4大小;如何进行上采样恢复呢?

1、将图像在每个方向扩大为原来的两倍,新增的行和列以0填充;

2、使用先前同样的内核(乘以4)与放大后的图像卷积,获得 “新增像素” 的近似值。

pyrUp( src, dst, Size( src.cols*2, src.rows*2 ) );

函数原型为:void pyrUp(InputArray src, OutputArray dst, const Size& dstsize=Size(), int borderType=BORDER_DEFAULT );

第三个参数默认情况下是:Size(src.cols*2, (src.rows*2),不过在任何情况下,都受约束:

|dstsize.width - src.cols * 2| ≤ (dstsize.width mod 2)

|dstsize.height - src.rows * 2| ≤ (dstsize.height mod 2)

这个函数执行的是高斯金字塔重构的上采样,尽管实际上它能够用来重构拉普拉斯金字塔。

四、阈值操作

OpenCV中提供了阈值(threshold)函数: threshold().阈值的原理就是设定一个值,将大于这个值的像素做一个操作;小于这个值的像素做另一个操作。比如可以设定二值阈值化,大于100的像素点直接设置成255,小于100的像素点直接设置成0,达到巨大反差的效果。

在opencv中有5种阈值的操作:二进制阈值、反二进制阈值、截断阈值、阈值化为0、反阈值化为0.

1、二进制阈值

解释:在运用该阈值类型的时候,先要选定一个特定的阈值量,比如:125,这样,新的阈值产生规则可以解释为大于125的像素点的灰度值设定为最大值(如8位灰度值最大为255),灰度值小于125的像素点的灰度值设定为0。

2、反二进制阈值

解释:该阈值化与二进制阈值化相似,先选定一个特定的灰度值作为阈值,不过最后的设定值相反。(在8位灰度图中,例如大于阈值的设定为0,而小于该阈值的设定为255)。

3、截断阈值

解释:同样首先需要选定一个阈值,图像中大于该阈值的像素点被设定为该阈值,小于该阈值的保持不变。(例如:阈值选取为125,那小于125的阈值不改变,大于125的灰度值(230)的像素点就设定为该阈值)。

4、阈值化为0

解释::先选定一个阈值,然后对图像做如下处理:1
像素点的灰度值大于该阈值的不进行任何改变;2 像素点的灰度值小于该阈值的,其灰度值全部变为0。这个很像Hinton他们提出的ReLU啊。操作过程是完全的一模一样啊。

5、反阈值化为0

解释:原理类似于0阈值,但是在对图像做处理的时候相反,即:像素点的灰度值小于该阈值的不进行任何改变,而大于该阈值的部分,其灰度值全部变为0

这5个阈值操作也是在一个函数上运行得到的,函数的原型为:

double threshold(InputArray src, OutputArray
dst, double thresh, double maxval, int type);

参数列表:原图像、目的图像、阈值、最大值、阈值类型。

原图像:单通道的,而且是8位或者32位的浮点数

目标图像:与原图像一样

阈值:自己定

最大值:需要与THRESH_BINARY和THRESH_BINARY_INV这两种阈值类型情况下才会起作用

阈值类型:THRESH_BINARY、THRESH_BINARY_INV、THRESH_TRUNC、THRESH_TOZERO、THRESH_TOZERO_INV,这5个内部定义的enum类型,它们的值分别为(0,1,2,3,4);

note:正如上面的函数原型第一个参数说的,这个函数只支持灰度图,所以使用之前需要使用cvtColor()函数进行转换。

五、边界扩充

这个部分在本科做图像处理的时候不知道有这个函数,自己硬生生的造了次轮子。原理就是当我们采用自己编写的过滤器或者卷积等操作的时候,图像内部的位置自然不用我们操心,可是当针对边界部分的像素,你说丢弃吧,又有些可惜,不丢弃吧,又没法操作。在opencv中是通过先将原始图像复制到另一个更大的图矩阵中,然后采用不同的方法来扩充边界(为什么需要复制呢,因为原始图像所占内存已经固定,不好自动扩展,当然了ROI也是取图像内部,所以可以直接在原始图像矩阵的内存上操作)。

函数原型为:void copyMakeBorder(InputArray src, OutputArray dst, int top, int bottom, int left, int right, int borderType,const Scalar&
value=Scalar() );

参数列表:原始图像、目标图像、顶部扩充大小、底部扩充大小、左边扩充大小、右边扩充大小、边界类型、边界值;

原始图像:没有任何约束;

目标图像:与原始图像有着同样的类型,但是尺寸变成了:Size(src.cols+left+right, src.rows+top+bottom)。

接下来四个参数:指定往外扩充的大小,top=1, bottom=1, left=1, right=1,那么就是表示往外扩充1个像素。

边界类型:从<imgproc.hpp>中62行开始的

enum{ BORDER_REPLICATE=IPL_BORDER_REPLICATE, BORDER_CONSTANT=IPL_BORDER_CONSTANT,

       BORDER_REFLECT=IPL_BORDER_REFLECT, BORDER_WRAP=IPL_BORDER_WRAP,

       BORDER_REFLECT_101=IPL_BORDER_REFLECT_101, BORDER_REFLECT101=BORDER_REFLECT_101,

       BORDER_TRANSPARENT=IPL_BORDER_TRANSPARENT,

       BORDER_DEFAULT=BORDER_REFLECT_101, BORDER_ISOLATED=16 };

表明这也是个enum类型,其中有着不同边界类型的内置情况。值分别为(1,0,2,3,4,4,5,4,16);不过在

《opencv2.4.9refman》中对这个函数就介绍了两种情况:常数边界( BORDER_CONSTANT)和复制边界(BORDER_REPLICATE);

边界值:当第四个参数边界类型为常数边界的时候,这个值才有效。

note:该函数是将原图像复制到目标图像的中间,然后进行边界的扩充,但是对于FilterEngine或者过滤函数来说,却不是基于这个函数来的,不过对于其他更加复杂的函数,包括自己写的函数,却可以这样简单的处理图像边界;

这个函数也支持当原图像已经被复制到了目标图像中间,这样的话这个函数就不复制原图像自身了,而是只简单的扩充边界(这种情况多见于采取ROI,也就是你已经在原始图像上选定了一个ROI,只是需要用其他颜色把这个ROI框起来罢了。)

不过有时候我们不想这样做,所以需要关闭那个自动优化的功能,然后总是做额外的填充,那么如果原图像不是一个ROI的话,可以将边界设置成BORDER_ISOLARED.

opencv6.2-imgproc图像处理模块之图像尺寸上的操作及阈值的更多相关文章

  1. opencv6.3-imgproc图像处理模块之边缘检测

    接opencv6.2-improc图像处理模块之图像尺寸上的操作 本文大部分都是来自于转http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutori ...

  2. opencv6.4-imgproc图像处理模块之直方图与模板

    接opencv6.3-imgproc图像处理模块之边缘检测 九.直方图的相关操作 直方图是图像中像素强度分布的图形表达方式:它统计了每一个强度值所具有的像素个数 上图是一个灰色图像,通过对图像的每个不 ...

  3. opencv6.5-imgproc图像处理模块之轮廓

    接opencv6.4-imgproc图像处理模块之直方图与模板 这部分的<opencv_tutorial>上都是直接上代码,没有原理部分的解释的. 十一.轮廓 1.图像中找轮廓 /// 转 ...

  4. python图像处理模块Pillow--Image模块

    一.简介 PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了.PIL功能非常强大,但API却非常简单易用 由于PIL仅支持到Python 2.7,加上 ...

  5. TensorFlow 图像预处理(一) 图像编解码,图像尺寸调整

    from: https://blog.csdn.net/chaipp0607/article/details/73029923 TensorFlow提供了几类图像处理函数,下面介绍图像的编码与解码,图 ...

  6. 跟我学Python图像处理丨关于图像金字塔的图像向下取样和向上取样

    摘要:本文讲述图像金字塔知识,了解专门用于图像向上采样和向下采样的pyrUp()和pyrDown()函数. 本文分享自华为云社区<[Python图像处理] 二十一.图像金字塔之图像向下取样和向上 ...

  7. IOS7官方推荐图标和图像尺寸

    图标和图像大小 每一个应用程序需要一个应用程序图标和启动图像.此外,一些应用程序需要自定义的图标来表示特定于应用程序的内容,功能,或在导航栏,工具栏和标签栏模式. 不像其他的定制艺术品在您的应用程序的 ...

  8. Opencv-Python:图像尺寸、图像的读取、显示、保存与复制

    Opencv-Python:图像尺寸.图像的读取.显示.保存与复制 原创 2017年11月23日 21:30:49 4440 在使用opencv的方法时,首先必须导入opencv包.新的opencv导 ...

  9. Win8 Metro(C#)数字图像处理--3.2图像方差计算

    原文:Win8 Metro(C#)数字图像处理--3.2图像方差计算 /// <summary> /// /// </summary>Variance computing. / ...

随机推荐

  1. SQL Server(九)——事务

    事务: 保障流程的完整执行,就像银行取钱,先在你账上扣钱,然后存入别人的账上:但是从你账上扣完钱了,突然网断了,对方没有收到钱,那么此时你的钱也没了,别人的钱也没加上,事务为了防止此类情况的出现. 事 ...

  2. MySQL锁机制总结(二)

    前言: Mysql是一个支持插件式存储引擎的数据库系统,本文讨论的锁机制也主要包含两部分SERVER层的锁和存储引擎的锁,存储引擎是指innodb,其它存储引暂不讨论. 1. 数据库中锁相关的基本概念 ...

  3. WebApi深入学习--概述+路由查找

    如何创建Controller这里就不说了,只写一些可能是高阶知识的内容 关于WebApi的官方介绍及示例 http://www.asp.net/web-api/ 1.跨域 Asp.NET有专门的跨域扩 ...

  4. 烂泥:mysql5.5主从同步复制配置

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 在上篇文章<烂泥:学习mysql数据库主从同步复制原理>中,我们介绍了有关mysql主从复制的基本原理.在这篇文章中,我们来实际测试下mys ...

  5. 初识Hadoop入门介绍

    初识hadoop入门介绍 Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我们的项目,但是我会继续研究下去,技多不压身. < ...

  6. 学习OpenStack之(5):在Mac上部署Juno版本OpenStack 四节点环境

    0. 前沿 经过一段时间的折腾,终于在自己的Mac上装好了Juno版本的四节点环境.这过程中,花了大量的时间,碰到了许多问题,学到不少知识,折腾过不少其实不需要折腾的东西,本文试着来对这过程做个总结. ...

  7. spring mvc 详细配置(转)

    转自: http://www.cnblogs.com/superjt/p/3309255.html 现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是 ...

  8. 睡觉问题早晚成为我顶头疼的问题。。。-PHP

    hi 昨晚又作自己,睡不好整个人都不好... 1.PHP实现页面静态化 二.纯静态化 2.2 实现页面纯静态化的原理 --基本方式 file_put_contents()函数: 使用php内置缓存机制 ...

  9. NOIP2008传纸条[DP]

    题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...

  10. Google Play笔记之上架

    我最近负责Google Play上架的主要工作 ,现已进入开放测试阶段(随后就可全球首发~~).接入工作已完成,这篇记录一下上架后期的笔记. 开放测试 开放测试是指对所有玩家进行开放式测试,玩家可以通 ...