<学习opencv>图像变换
拉伸、收缩、扭曲和旋转 统一调整大小
我们经常会遇到一些我们希望转换为其他尺寸的图像。
我们可能想要扩大或缩小图像; 这两项任务都是由同一个功能完成的。 cv::resize()
该cv::resize()函数的作用是:处理所有这些调整大小的需求。
我们提供我们的输入图像和我们希望它转换成的大小,它将生成一个所需大小的新图像。 void cv::resize(
cv::InputArray src,
cv :: OutputArray dst,//结果图像
cv :: Size dsize,//新尺寸
double fx = 0,// x-rescale
double fy = 0,// y-rescale
int interpolation = CV :: INTER_LINEAR //插值方法
); 我们可以用两种方式指定输出图像的大小。一种方法是使用绝对尺寸 ;
在这种情况下,dsize 参数直接设置我们希望结果图像的大小dst 。
另一种选择是使用相对尺寸;在这种情况下,我们设置dsize 到cv::Size(0,0),并设置fx 和fy 对规模因素,
我们想分别适用于x轴和y轴。最后一个参数是方法,默认为线性插值。 cv :: resize()插值选项
---------------------------------------------
插值 含义
cv::INTER_NEAREST 最近的邻居
cv::INTER_LINEAR 双线性
cv::INTER_AREA 像素区域重采样
cv::INTER_CUBIC 双立方插值
cv::INTER_LANCZOS4 Lanczos插值超过8×8邻域。
---------------------------------------------
Interpolation是这里的一个重要问题。源图像中的像素位于整数网格上;
例如,我们可以在位置(20、17)引用像素。当这些整数位置映射到新图像时,
可能会有间隙-要么是因为整数源像素位置映射到目标图像中的浮点位置,
必须四舍五入到最近的整数像素位置,要么是因为有些位置没有像素配置到e映射
(考虑通过拉伸使图像大小加倍;然后将其他目标像素留空)。
这些问题通常被称为正投影问题。为了解决这种舍入问题和目的地间隙,
我们实际上是向后解决问题:我们跨过目的地图像的每个像素,
然后问,“源中需要哪些像素来填充目的地像素?”
“这些源像素几乎总是在分数像素位置上,因此我们必须对源像素进行插值,
以获得目标值的正确值。默认方法是双线性插值,但您可以选择其他方法 最简单的方法是从源图像中最接近的像素获取调整后的像素值;
这是选择插值值cv::inter-nearest的效果。
或者,我们可以根据2×2周围的源像素值与目标像素的距离对其进行线性加权,
这就是cv::inter_linear所做的。我们还可以将新的、调整大小的像素放置在旧像素上,
然后平均覆盖的像素值,就像使用cv::inter_区域一样。2对于更平滑的插值,
我们可以选择在源图像中的4×4周围像素之间拟合一个三次样条曲线,
然后从拟合的样条曲线中读取相应的目标值;这是选择cv::inter-cubic插值方法的结果。
最后,我们有兰佐斯插值,这类似于三次方方法,但使用来自8×8像素周围区域的信息。 [注意]
注意cv::resize()与cv::mat类中类似名称的cv::mat::resize()
成员函数之间的区别是很重要的。cv::resize()创建一个不同大小的新图像,
在该图像上映射原始像素。cv::mat::resize()成员函数可调整正在调用其成员的图像的大小,
并将该图像裁剪为新的大小。在cv::mat::resize()的情况下,像素不会被插值(或外推) 图像金字塔
图像金字塔[Adelson84]广泛应用于各种视觉应用。
图像金字塔是一组图像——所有这些图像都来自于一个原始图像——它们被连续地降采样,
直到达到某个所需的停止点。(此停止点可以是单像素图像!)
在文献和应用中经常出现两种图像金字塔:高斯金字塔和拉普拉斯金字塔。
高斯金字塔用于对图像进行降采样,当我们想从金字塔中较低的图像重建上采样图像时,需要使用拉普拉斯金字塔。 cv::pyrDown()
通常,我们 在高斯中产生层(i + 1) 金字塔(我们用金字塔表示G i + 1)
表示金字塔的层G i ,首先将G i 与高斯核卷积,然后删除每个偶数行和列。
当然,在这种情况下,每个图像恰好是其前身的四分之一面积。
在输入图像G 0上迭代该过程产生整个金字塔。
OpenCV为我们提供了一种从其前身生成每个金字塔阶段的方法:
void cv::pyrDown(
cv::InputArray src, //输入图像
cv::OutputArray dst, //结果图像
const cv::size&dstsize = cv::Size() //输出图像大小
) 如果我们将destination size参数dstsize设置为其默认值cv::size(),
cv::pyrdown()方法将为我们实现这一点。
更具体地说,输出图像的默认大小是((src.cols+1)/2,(src.rows+1)/2)。
或者,我们可以提供一个dstsize,它将指示我们希望输出图像的大小;
但是dstsize必须遵守一些非常严格的约束。 此限制意味着目标图像非常接近 源图像大小的一半。
dstsize参数只用于处理一些需要对金字塔的构造方式进行非常严格控制的深奥情况。 cv::buildPyramid()
有一个图像并希望构建一个新图像序列是一种相对常见的情况,
每个新图像都是从其前一个图像缩小的。
函数cv::buildPyramid()在一次调用中为您创建这样一组图像 void cv :: buildPyramid(
cv :: InputArray src,//输入图像
cv :: OutputArrayOfArrays dst,//从金字塔输出图像
int maxlevel //金字塔等级数
); 参数src是源映像。参数dst的类型cv::outputarayofrays看起来有些不寻常,
但可以将其视为stl向量<>或cv::outputaray类型的对象。
最常见的例子是vector<cv::mat>。参数maxlevel指示要构造多少金字塔级别。 参数maxlevel是大于或等于0的任何整数,并指示要生成的金字塔图像数。
当cv::buildPyramid()运行时,它将返回DST中长度为maxLevel+1的向量。
DST中的第一个条目将与SRC相同。第二个将是最大的一半,
也就是说,调用cv::pyrdown()所产生的结果。
第三个将是第二个的一半大小,以此类推. cv::pyrUp()
同样,我们可以通过以下类似的方法(但不是相反的方法)将现有图像转换为每个方向两倍大的图像。
操作:
void cv :: pyrUp(
cv :: InputArray src,//输入图像
cv :: OutputArray dst,//结果图像
const cv :: Size&dstsize = cv :: Size()//输出图像大小
); 在这种情况下,图像首先增大到每个维度中原始的两倍,新(偶数)行填充0。此后,利用高斯滤波器5执行卷积 以近似“丢失”像素的值。 类似于cv::PyrDown() ,如果dstsize 设置为其默认值cv::Size(),
则生成的图像将是大小(在每个维度中)的两倍src。
同样,我们可以提供一个dstsize指示我们想要输出图像的大小dstsize,
但它必须再次遵守一些非常严格的约束。特别: 这一限制意味着目标图像的大小接近源图像的两倍。和以前一样,
dstsize参数只用于处理一些需要对金字塔的构造方式进行非常严格控制的深奥情况。 拉普拉斯金字塔
我们之前已经注意到,运算符cv::pyrup()不是cv::pyrup()的倒数。
这应该很明显,因为cv::pyrdown()是一个丢失信息的运算符。
为了恢复原始(高分辨率)图像,我们需要访问被降采样过程丢弃的信息。
这些数据形成了拉普拉斯金字塔。 这里,操作者UP() 通过将 原始图像中的位置(x,y)
中的每个像素映射到目标图像中的像素(2 x + 1,2 y + 1)来进行放大。
⊗符号表示卷积; 和g 5 × 5 是一个5×5高斯核。当然,UP (ģ i 1 )⊗ 克5 × 5 是定义 由OpenCV中提供的操作员。
因此,我们可以使用OpenCV直接计算拉普拉斯算子:cv::pyrUp()
<学习opencv>图像变换的更多相关文章
- [opencv]<学习Opencv>英文原版翻译学习
[注]下文全部内容为 <<Learning OpenCV 3: Computer Vision in C++ with the OpenCV Library>>经由在线翻译整理 ...
- 学习opencv之路(一)
先看一下<学习opencv> 找几个demo 学会相机标定 我做的是单目相机的标定.
- [纯小白学习OpenCV系列]官方例程00:世界观与方法论
2015-11-11 ----------------------------------------------------------------------------------- 其实,写博 ...
- 《学习OpenCV》中求给定点位置公式
假设有10个三维的点,使用数组存放它们有四种常见的形式: ①一个二维数组,数组的类型是CV32FC1,有n行,3列(n×3) ②类似①,也可以用一个3行n列(3×n)的二维数组 ③④用一个n行1列(n ...
- 对人脑处理视觉的描述(摘《学习OpenCV(中文版)》)
人脑将视觉信号划分入很多个通道,将各种不同的信息输入你的大脑.你的大脑有一个关注系统,会根据任务识别出图像的重要部分,并做重点分析,而其他部分则分析得较少 .在人类视觉流中存在大量的反馈,但是目前我们 ...
- 《学习OpenCV》练习题第五章第二题abc
代码: #include <stdio.h> #include <opencv/highgui.h> #include <opencv/cv.h> #include ...
- 《学习OpenCV》练习题第五章第一题ab
这道题是载入一幅带有有趣纹理的图像并用不同的模板(窗口,核)大小做高斯模糊(高斯平滑),然后比较用5*5大小的窗口平滑图像两次和用11*11大小的窗口平滑图像一次是否接近相同. 先说下我的做法,a部分 ...
- 《学习OpenCV》练习题第四章第八题ab
这道题是利用OpenCV例子程序里自带的人脸检测程序,做点图像的复制操作以及alpha融合. 说明:人脸检测的程序我参照了网上现有的例子程序,没有用我用的OpenCV版本(2.4.5)的facedet ...
- 《学习OpenCV》练习题第四章第三题b
#include <highgui.h> #include <cv.h> #include "opencv_libs.h" /* *<学习OpenCV ...
随机推荐
- flink-----实时项目---day04-------1. 案例:统计点击、参与某个活动的人数和次数 2. 活动指标多维度统计(自定义redisSink)
1. 案例 用户ID,活动ID,时间,事件类型,省份 u001,A1,2019-09-02 10:10:11,1,北京市 u001,A1,2019-09-02 14:10:11,1,北京市 u001, ...
- 案例分析 CAN OPEN 调试记录 进度
2020.12.29 发现一片博客:https://blog.csdn.net/harrycomeon/article/details/94650103 需要一个硬件:CAN分析仪,网上200元左右. ...
- ebs 初始化登陆
BEGIN fnd_global.APPS_INITIALIZE(user_id => youruesr_id, esp_id => yourresp_id, resp_appl_id = ...
- oracle 当月日历的sql
select max(sun) sun, max(mon) mon, max(tue) tue, max(wed) wed, max(thu) thu, max(fri) fri, max(sat) ...
- Identity Server 4 从入门到落地(十一)—— Docker部署
前面的部分: Identity Server 4 从入门到落地(一)-- 从IdentityServer4.Admin开始 Identity Server 4 从入门到落地(二)-- 理解授权码模式 ...
- gogs报错解决合集
目录 一.在组织中添加成员,一直显示普通用户 一.在组织中添加成员,一直显示普通用户 组织是公司,团队是公司中的不同队伍.例如A团队设置为加入就有管理员权限,那加入就有管理员. 但在组织成员那一栏中加 ...
- py脚本 获取当前运行服务的相关信息
一.简介 最近在统计系统中都部署了什么服务,但服务器太多,在没有标准化之前进行整理,还是写脚本收集方便一些. 当然还是需要人工去判断整理表格,为后面标准化做准备.脚本是python2.7的,默认的ce ...
- 【论文笔记】SamWalker: Social Recommendation with Informative Sampling Strategy
SamWalker: Social Recommendation with Informative Sampling Strategy Authors: Jiawei Chen, Can Wang, ...
- 一站式云原生在线研发平台 StarOS 种子用户邀请计划正式开启!
云时代的开发者,你好: 你是否也曾畅想过,关于云的未来? 不是作为消费者,也不是作为企业,是对于开发者而言,云会变成什么样. 同为开发者,我们常在想,我们开发了一个又一个应用,让太多人因服务在线而获益 ...
- 升级过log4j,却还没搞懂log4j漏洞的本质?
摘要:log4j远程代码漏洞问题被大范围曝光后已经有一段时间了,今天完整讲清JNDI和RMI以及该漏洞的深层原因. 本文分享自华为云社区<升级过log4j,却还没搞懂log4j漏洞的本质?为你完 ...