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

OpenCV几何图像变换(7)重映射函数 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 中的单独浮点地图,或者作为 map1 中交错的浮点地图 (x, y),或者被编码为使用 convertMaps 创建的固定点地图。你可能会想从浮点表示转换到固定点表示的原因是后者可以产生更快(大约快两倍)的重映射操作。在转换的情况下,map1 包含对 (cvFloor(x), cvFloor(y)) 的配对,而 map2 包含在插值系数表中的索引。

在OpenCV中,remap()函数是一个非常强大的工具,用于对图像进行任意形式的重映射。这意味着你可以通过提供映射函数来自定义每个像素的新位置,从而实现各种各样的图像变换效果。

此函数不能原地操作。

函数原型


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

参数

  • 参数src 源图像。
  • 参数dst 目标图像。它具有与 map1 相同的尺寸和与 src 相同的类型。
  • 参数map1 第一个地图,可以是 (x, y) 点或仅 x 值,具有类型 CV_16SC2, CV_32FC1, 或 CV_32FC2。有关将浮点表示转换为固定点以提高速度的详细信息,请参阅 convertMaps。
  • 参数map2 T第二个地图,包含 y 值,具有类型 CV_16UC1, CV_32FC1, 或无(如果 map1 是 (x, y) 点,则为空地图)。
  • 参数interpolation 插值方法(参见 InterpolationFlags)。该函数不支持 INTER_AREA 和 INTER_LINEAR_EXACT 方法。
  • 参数borderMode 像素外推方法(参见 BorderTypes)。当 borderMode 为 BORDER_TRANSPARENT 时,意味着目标图像中对应于源图像中的“异常值”的像素不会被函数修改。
  • 参数borderValue 在存在常数边界时所使用的值。默认情况下,它是 0。

代码示例


#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;int main(int argc, char** argv)
{// 读取图像Mat src = imread("/media/dingxin/data/study/OpenCV/sources/images/fruit_small.jpg");if (src.empty()) {std::cerr << "Error: Could not open or find the image." << std::endl;return -1;}Mat horiImage;Mat verImage;Mat srcx(src.rows, src.cols, CV_32F); // x 方向Mat srcy(src.rows, src.cols, CV_32F); // y 方向//水平镜像for (size_t i = 0; i < src.rows; i++){for (int j = 0; j < src.cols; j++){srcx.at<float>(i, j) = src.cols - j - 1;srcy.at<float>(i, j) = i;}}remap(src, horiImage, srcx, srcy, INTER_LINEAR);//垂直镜像for (size_t i = 0; i < src.rows; i++){for (int j = 0; j < src.cols; j++){srcx.at<float>(i, j) = j;srcy.at<float>(i, j) = src.rows -i -1;}}remap(src, verImage, srcx, srcy, INTER_LINEAR);imshow("原始图像",src);imshow("水平镜像", horiImage);imshow("垂直镜像", verImage);waitKey(0);return 1;}

运行结果

在这里插入图片描述


http://www.mrgr.cn/news/5540.html

相关文章:

  • Redis非关系型数据库
  • 主机ssh连接不上vmware的虚拟机
  • 水凝胶结机器人咋自主运动?利用拓扑调用的自我调节!
  • AWS 注册一年后是否需要花钱?
  • UDS 诊断 - ReadDataByPeriodicIdentifier(按周期性标识符读取数据)(0x2A)服务
  • wincc报警如何通过短信发送给手机
  • iOS开发进阶(二十三):iOS 常见面试题汇总
  • C++类模板初阶
  • 低代码开发:机遇与挑战并存的技术革新
  • 导出运营数据Excel报表
  • 小程序学习day11-生命周期函数、组件所在页面的生命周期、自定义组件的插槽、自定义组件的父子通信
  • 什么是网络安全?网络安全防范技术包括哪些?
  • Python中的鸭子类型
  • go中使用反射的动态方法调用
  • 《智慧公厕系列产品:引领公共卫生设施新变革》@卓振思众
  • 去雾去雨算法
  • 二手手机管理系统|基于Springboot的二手手机管理系统设计与实现(源码+数据库+文档)
  • SQL,将多对多的关联记录按行输出
  • opencv-python图像增强十:图像色温调整
  • Github文件夹重命名|编程tips·24-08-22