重映射的概念
重映射,就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。
实现重映射:remap 函数
将图像进行重映射几何变换,基于的公式为:dst (x, y) = src ( mapx (x, y), mapy (x, y) )
void remap(InputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpolation, int borderMode = BORDER_CONSTANT, const Scalar& borderValue = Scalar());
- src,输入图像,即源图像,填灰度图或真彩图均可。
- dst,输出图像,需要和源图像有一样的尺寸和类型。
- map1,即 mapx。
- map2,即 mapy 。
- interpolation,插值方法。插值就是根据已知数据点(条件),来预测未知数据点值得方法。在重映射过程中,图像的大小可能发生改变。此时像素与像素之间的关系就不是一一对应关系,因此在重映射过程中,可能会涉及到像素值的插值计算。可选插值方式如下:
INTER_NEAREST(最近邻差值)
INTER_LINEAR(双线性插值,一般选择这种方式)
INTER_CUBIC(双三次样条插值,超过 4×4 像素邻域内的双三次插值)
INTER_LANCZOS4(Lanczos 插值,超过 8×8 像素邻域的 Lanczos 插值)
- borderMode,边界扩展类型。默认值为 BORDER_CONSTANT,详解链接:https://www.cnblogs.com/bjxqmy/p/12306276.html
- borderValue ,只有当 borderMode取值为 BORDER_CONSTANT 时,这个参数才会被使用,边界会被填充成 borderValue 指定的颜色。
代码示例:
#include<opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main() {
Mat src = imread("C:/Users/齐明洋/Desktop/1.jpg");
imshow("src", src);
//180°旋转
Mat x_map = Mat(src.size(), CV_32FC1), y_map = Mat(src.size(), CV_32FC1);
for (int i = 0; i < src.rows; i++) {
float* x_rows = x_map.ptr<float>(i);
float* y_rows = y_map.ptr<float>(i);
for (int j = 0; j < src.cols; j++) {
x_rows[j] = static_cast<float>(src.cols - j);
y_rows[j] = static_cast<float>(src.rows - i);
}
}
Mat dst;
remap(src, dst, x_map, y_map, INTER_LINEAR);
imshow("dst", dst);
waitKey(0);
}
效果演示:
借鉴博客:https://www.cnblogs.com/HL-space/p/10546595.html
https://blog.csdn.net/weixin_39746114/article/details/82467458