重映射是什么意思?

  • 把一个图像中一个位置的像素放置到另一个图片指定位置的过程.

  • 为了完成映射过程, 有必要获得一些插值为非整数像素坐标,因为源图像与目标图像的像素坐标不是一一对应的.

  • 我们通过重映射来表达每个像素的位置  :

    这里  是目标图像,  是源图像,  是作用于  的映射方法函数.

让我们来思考一个快速的例子. 想象一下我们有一个图像  , 我们想满足下面的条件作重映射:

会发生什么? 图像会按照  轴方向发生翻转.

映射函数 remap. 参数说明:

代码如下:

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h> using namespace cv; /// Global variables
Mat src, dst;
Mat map_x, map_y;
char* remap_window = "Remap demo";
int ind = ; /// Function Headers
void update_map(void); /**
* @function main
*/
int main(int argc, char** argv)
{
/// Load the image
src = imread("E:\\VS2015Opencv\\vs2015\\project\\picture\\06.jpg", ); /// Create dst, map_x and map_y with the same size as src:
dst.create(src.size(), src.type());
map_x.create(src.size(), CV_32FC1);
map_y.create(src.size(), CV_32FC1); /// Create window
namedWindow(remap_window, CV_WINDOW_AUTOSIZE); /// Loop
while (true)
{
/// Each 1 sec. Press ESC to exit the program
int c = waitKey(); if ((char)c == )
{
break;
} /// Update map_x & map_y. Then apply remap
update_map();
remap(src, dst, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(, , )); /// Display results
imshow(remap_window, dst);
}
return ;
} void update_map(void)
{
ind = ind % ; for (int j = ; j < src.rows; j++)
{
for (int i = ; i < src.cols; i++)
{
switch (ind)
{
case :
if (i > src.cols*0.25 && i < src.cols*0.75 && j > src.rows*0.25 && j < src.rows*0.75)
{
map_x.at<float>(j, i) = * (i - src.cols*0.25) + 0.5;
map_y.at<float>(j, i) = * (j - src.rows*0.25) + 0.5;
}
else
{
map_x.at<float>(j, i) = ;
map_y.at<float>(j, i) = ;
}
break;
case :
map_x.at<float>(j, i) = i;
map_y.at<float>(j, i) = src.rows - j;
break;
case :
map_x.at<float>(j, i) = src.cols - i;
map_y.at<float>(j, i) = j;
break;
case :
map_x.at<float>(j, i) = src.cols - i;
map_y.at<float>(j, i) = src.rows - j;
break;
} // end of switch
}
}
ind++;
}

主要代码说明:

建立一个间隔1000毫秒的循环,每次循环执行更新映射矩阵参数并对源图像进行重映射处理(使用 mat_x 和 mat_y),然后把更新后的目标图像显示出来:

重映射函数 remap. 参数说明:

  • src: 源图像
  • dst: 目标图像,与 src 相同大小
  • map_x: x方向的映射参数. 它相当于方法  的第一个参数
  • map_y: y方向的映射参数. 注意 map_y 和 map_x 与 src 的大小一致。
  • CV_INTER_LINEAR: 非整数像素坐标插值标志. 这里给出的是默认值(双线性插值).
  • BORDER_CONSTANT: 默认
while (true)
{
/// Each 1 sec. Press ESC to exit the program
int c = waitKey(1000); if ((char)c == 27)
{
break;
} /// Update map_x & map_y. Then apply remap
update_map();
remap(src, dst, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0)); /// Display results
imshow(remap_window, dst);
}
return 0;
}

  我们做了什么哪些映射过程?(在这里 map_x 代表第一个坐标 h(i,j) , map_y 是第二个坐标,映射后的坐标)

void update_map(void)
{
ind = ind % ; for (int j = ; j < src.rows; j++)
{
for (int i = ; i < src.cols; i++)
{
switch (ind)
{
case :
if (i > src.cols*0.25 && i < src.cols*0.75 && j > src.rows*0.25 && j < src.rows*0.75)
{
map_x.at<float>(j, i) = * (i - src.cols*0.25) + 0.5;
map_y.at<float>(j, i) = * (j - src.rows*0.25) + 0.5;
}
else
{
map_x.at<float>(j, i) = ;
map_y.at<float>(j, i) = ;
}
break;
case :
map_x.at<float>(j, i) = i;
map_y.at<float>(j, i) = src.rows - j;
break;
case :
map_x.at<float>(j, i) = src.cols - i;
map_y.at<float>(j, i) = j;
break;
case :
map_x.at<float>(j, i) = src.cols - i;
map_y.at<float>(j, i) = src.rows - j;
break;
} // end of switch
}
}
ind++;

结果如下:

图像宽高缩小一半,并显示在中间:

图像上下颠倒:

图像左右颠倒:

两个方向同时颠倒:

OpenCV函数 重映射的更多相关文章

  1. opencv —— remap 重映射

    重映射的概念 重映射,就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程. 实现重映射:remap 函数 将图像进行重映射几何变换,基于的公式为:dst (x, y) = src ( mapx ...

  2. opencv之重映射

    好久没写呆码了 今天发个重映射 #include "opencv2/video/tracking.hpp" #include "opencv2/imgproc/imgpr ...

  3. opencv::像素重映射

    像素重映射(cv::remap) 简单点说就是把输入图像中各个像素按照一定的规则映射到另外一张图像的对应位置上去,形成一张新的图像. Remap( InputArray src, // 输入图像 Ou ...

  4. 【OpenCV新手教程之十七】OpenCV重映射 &amp; SURF特征点检測合辑

    本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/30974513 作者:毛星云(浅墨)  ...

  5. OpenCV探索之路(八):重映射与仿射变换

    重映射 重映射就是把一幅图像中某个位置的像素放置到另一个图片中指定位置的过程. 用一个数学公式来表示就是: 其中的 f 就是映射方式,也就说,像素点在另一个图像中的位置是由 f 来计算的. 在Open ...

  6. OpenCV学习笔记(九) 重映射、仿射变换

    重映射 通过重映射来表达每个像素的位置  : 这里  是目标图像,  是源图像,  是作用于  的映射方法函数.想象一下我们有一个图像  , 我们想满足下面的条件作重映射:,图像会按照  轴方向发生翻 ...

  7. opencv 5 图像转换(3 重映射 仿射变换 直方图均衡化)

    重映射 实现重映射(remap函数) 基础示例程序:基本重映射 //---------------------------------[头文件.命名空间包含部分]------------------- ...

  8. 单片机中printf函数的重映射

    单片机中printf函数的重映射 一.源自于:大侠有话说 1.如果你在学习单片机之前学过C语言,那么一定知道printf这个函数.它最最好用的功能 除了打印你想要的字符到屏幕上外,还能把数字进行格式化 ...

  9. OpenCV——重映射、仿射变换

    #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespac ...

随机推荐

  1. PS_0001:改变图片颜色 填充颜色

    1,创建新图存  ctrl + j 2,点击前景色按钮,改变颜色 3,前景色的键盘快捷键是“Alt+Delete”,背景色的键盘快捷键是“Ctrl+Delete”

  2. Pikachu-XXE(xml外部实体注入漏洞)

    XXE -"xml external entity injection"既"xml外部实体注入漏洞".概括一下就是"攻击者通过向服务器注入指定的xml ...

  3. pandas模块的数据操作

    数据操作 数据操作最重要的一步也是第一步就是收集数据,而收集数据的方式有很多种,第一种就是我们已经将数据下载到了本地,在本地通过文件进行访问,第二种就是需要到网站的API处获取数据或者网页上爬取数据, ...

  4. linux命令su,sudo 使用和区别

    1- sudo 与 su 两个命令的最大区别是: sudo 命令需要输入当前用户的密码,su 命令需要输入 root 用户的密码.另外一个区别是其默认行为.sudo 命令只允许使用提升的权限运行单个命 ...

  5. PAT (Basic Level) Practice (中文)1016 部分A+B (15 分)

    正整数 A 的“D​A​​(为 1 位整数)部分”定义为由 A 中所有 D​A​​ 组成的新整数 P​A​​.例如:给定 8,D​A​​=6,则 A 的“6 部分”P​A​​ 是 66,因为 A 中有 ...

  6. 常用的一些git命令整合

    一.创建一个版本库 1.mkdir xxx 2.git init 使用git init命令将这个目录变成Git可以管理的仓库 这个版本仓库创建好了,xxx目录下有一个隐藏的.git目录(里面有暂存区( ...

  7. Java体系结构

    java程序运行过程图 文章中内容大多来自该处Java虚拟机规范----JVM体系结构 - Java初级码农 - 博客园 JDK体系 JDK体系结构图 JDK.JRE.JVM之间的关系 JDK:Jav ...

  8. LVM实现将2块磁盘总空间“合二为一”并挂载到同一目录

    需求场景 将MySQL主机的2块18T的数据盘空间全部"合并"后挂载到/mysql_data目录下,要求文件系统格式化为xfs:已有关键信息梳理如下: 需要挂载的数据盘 /dev/ ...

  9. 多线程的sleep、yield、join用法及sleep与wait的区别

    Thread类的方法列表:sleep.yield.join用于线程的协作,围绕线程的调度 1.join()等待线程结束:调用join方法的线程,执行结束后才会释放锁.主线程main中调用启动线程(调用 ...

  10. FatMouse's Speed HDU - 1160 最长上升序列, 线性DP

    #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> usi ...