- 操作系统: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;
}