应用一个通用的几何变换到图像上。
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()
)
#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;
}