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

OpenCV 图形API(77)图像与通道拼接函数-----对图像进行几何变换函数remap()

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

对图像应用一个通用的几何变换。
函数 remap 使用指定的映射对源图像进行变换:
dst ( x , y ) = src ( m a p x ( x , y ) , m a p y ( x , y ) ) \texttt{dst} (x,y) = \texttt{src} (map_x(x,y),map_y(x,y)) dst(x,y)=src(mapx(x,y),mapy(x,y))
其中具有非整数坐标的像素值是使用一种插值方法计算得出的。
mapx 和 mapy 可以分别作为浮点型映射表存储在 map1 和 map2 中,
也可以将 (x, y) 坐标交错地存储在 map1 中,
或者使用 convertMaps 函数创建的定点格式的映射。

你可能希望将浮点型映射转换为定点格式的原因是,这样可以显著提升(大约 2 倍)重映射操作的速度。

在定点格式中,map1 包含了 (cvFloor(x), cvFloor(y)) 的配对值,而 map2 包含了一个用于插值系数表的索引。输出图像的大小和深度必须与输入图像相同。

注意
函数的文本 ID 是 “org.opencv.core.transform.remap”。
受当前实现限制,输入图像和输出图像的尺寸不得超过 32767x32767。

函数原型

GMat cv::gapi::remap 
(const GMat &  	src,const Mat &  	map1,const Mat &  	map2,int  	interpolation,int  	borderMode = BORDER_CONSTANT,const Scalar &  	borderValue = Scalar() 
) 	

参数

  • 参数 src:源图像。
  • 参数 map1:第一个映射表,可以是包含 (x, y) 点或仅包含 x 值的数组,类型可以是 CV_16SC2、CV_32FC1 或 CV_32FC2。
  • 参数 map2:第二个映射表,包含 y 值,类型可以是 CV_16UC1、CV_32FC1,或者为空(当 map1 已经包含 (x, y) 点时)。
  • 参数 interpolation:插值方法(参见 cv::InterpolationFlags)。该函数不支持 INTER_AREA 和 INTER_LINEAR_EXACT 方法。
  • 参数 borderMode:像素外推方法(参见 cv::BorderTypes)。当 borderMode=BORDER_TRANSPARENT 时,表示目标图像中对应于源图像“越界”位置的像素不会被修改。

代码示例

include <opencv2/gapi.hpp>
#include <opencv2/gapi/core.hpp>  // 包含G-API的核心功能
#include <opencv2/opencv.hpp>using namespace cv;
using namespace cv::gapi;// 示例函数:为简单起见,这里只是创建了两个简单的映射表
void createMaps( Size sz, Mat& map_x, Mat& map_y )
{map_x.create( sz, CV_32FC1 );map_y.create( sz, CV_32FC1 );for ( int j = 0; j < sz.height; ++j ){for ( int i = 0; i < sz.width; ++i ){map_x.at< float >( j, i ) = static_cast< float >( i-10 );map_y.at< float >( j, i ) = static_cast< float >( j-5 );}}
}int main()
{// 读取源图像Mat src = imread( "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png" );if ( src.empty() ){std::cerr << "无法读取图像,请检查路径!" << std::endl;return -1;}// 创建映射表,这里仅作演示目的,实际应用中应根据需求生成Mat map_x, map_y;createMaps( src.size(), map_x, map_y );  // 这里假设有一个函数createMaps用于创建映射表// 定义插值方法和边界模式int interpolation = INTER_LINEAR;  // 使用双线性插值int borderMode    = BORDER_CONSTANT;Scalar borderValue( 0, 0, 0 );  // 黑色填充边界// 使用G-API进行remap操作GMat in, out;GComputation remap_comp( GIn( in ), GOut( gapi::remap( in, map_x, map_y, interpolation, borderMode, borderValue ) ) );// 对图像执行计算Mat dst;remap_comp.apply( gin( src ), gout( dst ) );// 显示结果imshow( "原始图像", src );imshow( "重映射后的图像", dst );waitKey();return 0;
}

运行结果

在这里插入图片描述

相关文章:

  • 【愚公系列】《Manus极简入门》022-艺术创作顾问:“艺术灵感使者”
  • Pycharm(十九)深度学习
  • Android SDK 开发中的 AAR 与 JAR 区别详解
  • 爬虫程序中如何添加异常处理?
  • FPGA设计如何快速入门?(内附学习视频)
  • 【Crypto】第四届SQCTF-Crypto全解
  • tinyrenderer笔记(中)
  • SpringBoot中JWT详解,底层原理及生成验证实例。
  • Kafka与RocketMQ在事务消息实现上的区别是什么?
  • Transformer-LSTM混合模型在时序回归中的完整流程研究
  • 2025年01月09日德美医疗前端面试
  • Transformer 与 LSTM 在时序回归中的实践与优化
  • Mathematica中的ResourceFunction
  • 状态模式 VS 策略模式
  • Kotlin密封类优化Android状态管理
  • 从设计到应用:大尺寸PCB打样的关键领域解析
  • 使用 Spring Boot 构建 REST API
  • 【大语言模型ChatGPT+Python】近红外光谱数据分析及机器学习与深度学习建模(近红外光谱数据分析、定性/定量分析模型代码自动生成等)
  • setup 函数在 Vue 3 中的作用是什么?什么时候会执行
  • 打成jar 包以后,运行时找不到文件路径?
  • 体坛联播|国米淘汰巴萨晋级欧冠决赛,申花击败梅州避免连败
  • “五一”假期银联、网联共处理支付交易234.39亿笔
  • 儿童文学作家周晴病逝,享年57岁
  • 降雪致长白山天池景区关闭,有游客在户外等待一小时,景区回应
  • 重庆渝中警方:男子点燃摩托车欲寻衅滋事,被民警和群众合力制服
  • 铁路12306回应“五一前大量放票”传闻:个别方向和区段出现新增票额,均即时进入系统重新发售