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。

函数原型

cpp 复制代码
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 时,表示目标图像中对应于源图像"越界"位置的像素不会被修改。

代码示例

cpp 复制代码
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;
}

运行结果

相关推荐
白-胖-子4 小时前
深入剖析大模型在文本生成式 AI 产品架构中的核心地位
人工智能·架构
想要成为计算机高手5 小时前
11. isaacsim4.2教程-Transform 树与Odometry
人工智能·机器人·自动驾驶·ros·rviz·isaac sim·仿真环境
静心问道6 小时前
InstructBLIP:通过指令微调迈向通用视觉-语言模型
人工智能·多模态·ai技术应用
宇称不守恒4.07 小时前
2025暑期—06神经网络-常见网络2
网络·人工智能·神经网络
小楓12017 小时前
醫護行業在未來會被AI淘汰嗎?
人工智能·醫療·護理·職業
数据与人工智能律师7 小时前
数字迷雾中的安全锚点:解码匿名化与假名化的法律边界与商业价值
大数据·网络·人工智能·云计算·区块链
chenchihwen7 小时前
大模型应用班-第2课 DeepSeek使用与提示词工程课程重点 学习ollama 安装 用deepseek-r1:1.5b 分析PDF 内容
人工智能·学习
说私域7 小时前
公域流量向私域流量转化策略研究——基于开源AI智能客服、AI智能名片与S2B2C商城小程序的融合应用
人工智能·小程序
Java樱木8 小时前
AI 编程工具 Trae 重要的升级。。。
人工智能
AntBlack8 小时前
从小不学好 ,影刀 + ddddocr 实现图片验证码认证自动化
后端·python·计算机视觉