什么是图像变换

还是看OpenCV官方手册,我觉得这样可以同时学习如何使用函数和如何理解一些基本概念。

首先,这里的几何变换geometrical transformations是针对2D图像而言的,不改变图像内容而是将像素网格变形deform the pixel grid,映射到目标图像destination image。目标图像不是由源图像直接得到,因为数字图像是离散的,所以源图像的像素点的映射无法保证落在方格之内,所以在图像处理中采用的都是逆向法,即对目标图像的每一个像素点dst(x,y),在源图像中寻找对dst(x,y)产生贡献的点,这些点的值将直接决定dst(x,y)的值。在寻找的过程,就是反向映射inverse mapping 〈fx,fy〉的过程。这是寻找映射点的通用公式:

有两个问题是需要仔细考虑的:

外插Extrapolation,这是对于不存在的点而言的,因为逆向映射fx(x,y)或者fy(x,y)可能会映射到源图像之外,就像滤波函数一样,OpenCV提供了外插的方法,此外,还提供了BORDER_TRANSPARENT.意味着不会对目标图像中的像素进行修改。

内插,反向映射如果是仿射或者透视变换affine or perspective transformation,或者径向透镜畸变校正radial lens distortion correction,找到的点坐标fx(x,y)或者fy(x,y)通常是浮点数floating-point numbers,而我们应该找到像素的分数坐标?fractional coordinates,最简单的是找到距离浮点数坐标最近的点,即最近邻内插,当然有更复杂的内插方法可以使用浮点数坐标的邻点进行插值,可以得到更好的效果。此外,OpenCV宏定义的其他内插方法有INTER_LINEAR、INTER_CUBIC、INTER_AREA、INTER_LANCZOS4等。

其中INTER_AREA 使用像素区域的关系。当图像下采样decimation(维基百科中downsampling and decimation是一个词条)时效果较好,因为不会产生摩尔纹moire'-free,但是当图像放大zoomed时,效果和最近邻方法相似。下图就是使用不同内插方法的放大效果,可以看到区域内插(第三行)和最近邻内插(第一行)效果近似。

INTER_LANCZOS4 使用了8x8 neighborhood

下面看几个OpenCV中的图像变换函数

Remap就是一个映射函数

void cv::remap 	(	InputArray 
src, OutputArray 
dst, InputArray 
map1, InputArray 
map2, int 	interpolation, int 	borderMode = BORDER_CONSTANT, const Scalar & 
borderValue = Scalar() )		

Mapx和mapy可以以浮点数floating-point的形式存放在map1和map2中,也可以交叉存储的形式都放在map1中。为了加快remapping速度(yield much faster (2x)),也可以使用convertMaps转换成更加紧凑more compact的fixed-point(可以理解为整型)的map,这样map1中存放pairs (cvFloor(x), cvFloor(y)),map2中存放插值系数表table of interpolation coefficients.

浮点数是表示小数的一种方法。所谓浮点就是小数点的位置不固定,浮点数由尾数和基数两部分组成,X = M * 2^E。与此相反有定点数,即小数点的位置固定。整数可以看做是一种特殊的定点数,即小数点在末尾。这里所说的“小数点”是一个隐式的小数点,并不是我们通常说的小数点。定点DSP处理一个浮点数一般需要两个定点运算器(一个处理尾数、一个处理基数)。定点DSP下,浮点运算比定点运算慢几个数量级。http://blog.sina.com.cn/s/blog_ebbe6d790102uwap.html

Remap将两幅图像之间的所有像素点的映射关系都通过映射图表现出来,所以适用于源图像和目标图像大小一样的左右镜像,上下镜像(翻转)等简单的规则变换。

#include<stdafx.h>
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{Mat srcImage = imread("D:\\b.jpg");Mat dstImage, map_x, map_y;imshow("", srcImage);//创建和原始图像一样的效果图,x重映射图,y重映射图dstImage.create(srcImage.size(), srcImage.type());map_x.create(srcImage.size(), CV_32FC1);map_y.create(srcImage.size(), CV_32FC1);//双层循环,遍历每一个像素点,改变map_x和map_y的值for (int j = 0; j<srcImage.rows; j++){for (int i = 0; i<srcImage.cols; i++){//改变map_x和map_y的值map_x.at<float>(j, i) = static_cast<float>(i );//y坐标在前image.at(x1, x2)=image.at(Point(x2, x1))//map_x.at<float>(j, i) = static_cast<float>(srcImage.rows - i);map_y.at<float>(j, i) = static_cast<float>(srcImage.rows - j);}}//进行重映射操作remap(srcImage, dstImage, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(255, 0, 0));//显示效果图imshow("效果图", dstImage);waitKey(0);return 0;}

仿射变换warpAffine

映射回源图像的x,y坐标都由目标图像的x,y和矩阵M中的元素决定。矩阵M是2x3的。这个矩阵在已知映射前后对应点对的坐标时也可以求到,使用函数getAffineTransform。

比仿射变换更复杂的是透视变换warpPerspective

函数是warpPerspective,变换矩阵M大小是3x3.可以由函数getPerspectiveTransform    计算变换矩阵

消除镜头失真undistort

这个函数是两个函数的结合a combination of cv::initUndistortRectifyMap (with unity R ) and cv::remap (with bilinear interpolation),前一个计算出失真并且以map的形式给出,第二个remap通过映射表将像素点进行映射。这个函数的主要参数有:

cameraMatrix,

distCoeffs,失真系数组成的数组vector,如果 vector 是 NULL/empty, 就假设0失真

newCameraMatrix,单目相机中,这个参数通常和cameraMatrix相等,立体相机中,通过函数cv::stereoRectify归一化到P1或者P2. 新的不同的相机在坐标空间coordinate space的方向需要根据R进行不同的调整。

R,物体空间object space中的光学矫正变换Optional rectification transformation。R1,R2,通过函数stereoRectify计算得到,这是一个3x3的矩阵,如果矩阵为空,则认为两个镜头的变换是一致的。

无失真的图像相当于是使用相机矩阵为newCameraMatrix并且失真系数为0 camera matrix =newCameraMatrix and zero distortion的相机得到的。

更多相机矫正和三维重建https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493616.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MSRA20周年研究趋势文章|图像识别的未来:机遇与挑战并存

文/微软亚洲研究院 代季峰 林思德 郭百宁识别图像对人类来说是件极容易的事情&#xff0c;但是对机器而言&#xff0c;这也经历了漫长岁月。在计算机视觉领域&#xff0c;图像识别这几年的发展突飞猛进。例如&#xff0c;在 PASCAL VOC 物体检测基准测试中&#xff0c;检测器的…

吴恩达作业7:梯度下降优化算法

先说说BatchGD用整个训练样本进行训练得出损失值&#xff0c;SGD是只用一个训练样本训练就得出损失值&#xff0c;GD导致训练慢&#xff0c;SGD导致收敛到最小值不平滑&#xff0c;故引入Mini-batch GD&#xff0c;选取部分样本进行训练得出损失值&#xff0c; 普通梯度下降算…

什么是单应矩阵和本质矩阵

知乎上面的大牛还是很多&#xff0c;直接搜Homography或者单应矩阵就能得到很多大神的回答&#xff0c;可能回答中的一句话或者一个链接就够自己学习很久。 其实在之前研究双目视觉的时候就接触了对极几何&#xff0c;通过视觉就可以得到物体的远近信息&#xff0c;这也是特斯…

tensorflow实现反卷积

先看ogrid用法 from numpy import ogrid,repeat,newaxis from skimage import io import numpy as np size3 x,yogrid[:size,:size]#第一部分产生多行一列 第二部分产生一行多列 print(x) print(y) 打印结果&#xff1a; newaxis用法&#xff1a; """ newaxis…

寿命能推算吗?加州大学科学家提出“预测方法”

来源&#xff1a;中国科学报从古至今&#xff0c;从国内到国外&#xff0c;从炼丹术到现代科学&#xff0c;长生不老似乎一直是人类乐此不疲的追求。但若要延缓衰老&#xff0c;首先要弄清是什么造成了衰老。近日&#xff0c;加州大学洛杉矶分校&#xff08;UCLA&#xff09;生…

Deep Image Homography Estimation

在知乎问题&#xff1a;深度学习应用在哪些领域让你觉得「我去&#xff0c;这也能行&#xff01;」&#xff1f;中遇到一篇提交在arXiv 2016&#xff08;arXiv不是正式发表&#xff0c;只是可以证明原创性&#xff0c;提供时间戳的网站&#xff09;的文章《Deep Image Homograp…

tensorflow:双线性插值反卷积

首先生成333的黑色图片 """ 生成333黑色图像 """ def produce_image():size 3x, y ogrid[:size, :size] # 第一部分产生多行一列 第二部分产生一行多列z x yz z[:, :, newaxis] # 增加第三维# print(z)img repeat(z, 3, 2)/12 # 在第三…

腾讯医疗AI新突破:提出器官神经网络,全自动辅助头颈放疗规划 | 论文

来源&#xff1a;量子位腾讯医疗AI实验室又有新研究。这次跟美国加州大学合作&#xff0c;在国际权威期刊《Medical Physics》发表最新研究成果&#xff1a;《器官神经网络&#xff1a;深度学习用于快速和全自动整体头颈危及器官靶区勾画》AnatomyNet: Deep Learning for Fast …

视频制作中的绿幕与拜耳阵列

先来欣赏一些大片背后的特效。 现在国内的电影市场越来越大&#xff0c;做短视频的自媒体也越来越多&#xff0c;在他们的后期视频制作的片花中可以看到很多都在使用绿幕或者蓝幕&#xff0c;这是为什么呢&#xff1f; 首先肯定是为了抠图的方便。将主体部分抠出再将通过特效…

吴恩达作业8:三层神经网络实现手势数字的识别(基于tensorflow)

数据集的载入&#xff0c;随机产生mini-batch放在tf_utils.py,代码如下 import h5py import numpy as np import tensorflow as tf import mathdef load_dataset():train_dataset h5py.File(datasets/train_signs.h5, "r")train_set_x_orig np.array(train_datase…

基于visual Studio2013解决面试题之0307最后谁剩下

&#xfeff;&#xfeff;&#xfeff;题目解决代码及点评/* n 个数字&#xff08;0,1,…,n-1&#xff09;形成一个圆圈&#xff0c;从数字 0 开始&#xff0c;每次从这个圆圈中删除第 m 个数字&#xff08;第一个为当前数字本身&#xff0c;第二个为当前数字的下一个数字&…

谷歌、苹果等大佬亲自戳穿自动驾驶完美童话,技术、场景、安全牢笼实难突围!...

来源&#xff1a; 物联网智库摘要&#xff1a;自动驾驶普及不仅局限于自身技术和应用场景&#xff0c;而且与产业链各环节密切相关。一项科技从诞生到被人们所接受是一个循序渐进的过程&#xff0c;自动驾驶真正普及还任重而道远。2018年11月1日百度世界大会上&#xff0c;百度…

使用文件监控对象FileSystemWatcher实现数据同步

使用文件监控对象FileSystemWatcher实现数据同步 原文 使用文件监控对象FileSystemWatcher实现数据同步 最近在项目中有这么个需求&#xff0c;就是得去实时获取某个在无规律改变的文本文件中的内 容。首先想到的是用程序定期去访问这个文件&#xff0c;因为对实时性要求很高&a…

吴恩达作业11:残差网络实现手势数字的识别(基于 keras)+tensorbord显示loss值和acc值

一&#xff0c;残差网络实现手写数字识别 数据集地址&#xff1a;https://download.csdn.net/download/fanzonghao/10551018 首先来resnets_utils.py,里面有手势数字的数据集载入函数和随机产生mini-batch的函数&#xff0c;代码如下&#xff1a; import os import numpy as…

通过SVD求解单应矩阵

我们现在知道原则上4对匹配点对就可以唯一确定单应矩阵&#xff0c;但是在实际应用中我们无法保证两个视图严格满足使用条件&#xff08;只有旋转变换&#xff1b;远景&#xff1b;平面场景&#xff09;&#xff0c;所以要使用拟合的方法求一个最优解。现在就来以SIFT算法源码为…

注意力机制(Attention)最新综述论文及相关源码

来源&#xff1a;专知注意力机制(Attention)起源于模仿人类的思维方式&#xff0c;后被广泛应用于机器翻译、情感分类、自动摘要、自动问答等、依存分析等机器学习应用中。专知编辑整理了Arxiv上一篇关于注意力机制在NLP中应用的综述《An Introductory Survey on Attention Mec…

橙子楼的猥琐大叔

故事要从暑假开始说起&#xff0c;那时我还在准备考研&#xff0c;每天往返于教室、宿舍和食堂&#xff0c;单调但不会无趣&#xff0c;常常会有故事发生&#xff0c;生活也很充实。 考研的一般都会在固定的教室有个自己的位子。 坐我正前面的是一个妹子&#xff0c;准确的说是…

Pycharm下安装Tensorflow

趁着帮师妹看Github上的一个项目&#xff0c;督促自己学习一下Python下训练神经网络的一整套流程。没想到在一开头就遇到了不少问题。首先是Pycharm中导入Github项目的问题&#xff0c;还有安装tensorflow的问题&#xff0c;之后又遇到了多种版本的Python共存的问题。在这里记录…

吴恩达作业9:卷积神经网络实现手势数字的识别(基于tensorflow)

数据集链接&#xff1a;https://download.csdn.net/download/fanzonghao/10551018 提供数据集代码放在cnn_utils.py里。 import math import numpy as np import h5py import matplotlib.pyplot as plt import tensorflow as tf from tensorflow.python.framework import ops…

AI洞观 | 戴上红帽 看IBM冲杀云计算市场

来源 | 网易智能&#xff08;公众号 smartman163&#xff09;摘要&#xff1a;可以预计&#xff0c;未来的云计算市场将越来越比拼生态综合服务能力&#xff0c;云计算行业进入下半场&#xff0c;谁在裸泳不久见分晓。IBM豪掷340亿美元收购红帽&#xff08;Red Hat&#xff09;…