remap重映射
视频讲解如下:
当前系列所有demo下载地址:
https://github.com/GaoRenBao/OpenCv4-Demo
不同编程语言对应的OpenCv版本以及开发环境信息如下:
语言 | OpenCv版本 | IDE |
C# | OpenCvSharp4.4.8.0.20230708 | Visual Studio 2022 |
C++ | OpenCv-4.5.5-vc14_vc15 | Visual Studio 2022 |
Python | OpenCv-Python (4.6.0.66) | PyCharm Community Edition 2022.1.3 |
本章节给大家讲讲如何对图像进行remap重映射操作。当前代码主体还是使用毛星云的demo,C#和Python都是在C++版本的基础上转换过来的,三个版本的效果基本一致。
首先我们需要准备一张测试图片:

三组代码运行效果都是一样的,我这里就不一一展示了,最终运行效果如下:

C#版本代码
C#版本需要安装“OpenCvSharp4”、“OpenCvSharp4.runtime.win”两个库才行。不然会报错。
如果需要使用“ BitmapConverter.ToBitmap”操作,则需要追加安装“OpenCvSharp4.Extensions”库。
using OpenCvSharp;
namespace demo
{
internal class Program
{
static void Main(string[] args)
{
//【1】载入原始图
Mat srcImage = Cv2.ImRead("../../../images/car.jpg");
//【2】显示原始图
Cv2.ImShow("【原始图】", srcImage);
//【2】创建和原始图一样的效果图,x重映射图,y重映射图
Mat dstImage = new Mat(srcImage.Size(), srcImage.Type());
Mat map_x = new Mat(srcImage.Size(), MatType.CV_32FC1);
Mat map_y = new Mat(srcImage.Size(), MatType.CV_32FC1);
//【3】双层循环,遍历每一个像素点,改变map_x & map_y的值
for (int j = 0; j < srcImage.Rows; j++)
{
for (int i = 0; i < srcImage.Cols; i++)
{
//改变map_x & map_y的值.
map_x.Set(j, i, (float)(i));
map_y.Set(j, i, (float)(srcImage.Rows - j));
}
}
//【4】进行重映射操作
Cv2.Remap(srcImage, dstImage, map_x, map_y, InterpolationFlags.Linear, BorderTypes.Constant, new Scalar(0, 0, 0));
//【5】显示效果图
Cv2.ImShow("【C# 效果图】", dstImage);
Cv2.WaitKey(0);
}
}
}
C++版本代码
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace cv;
int main()
{
//【0】变量定义
Mat srcImage, dstImage;
Mat map_x, map_y;
//【1】载入原始图
srcImage = imread("../images/car.jpg", 1);
if (!srcImage.data) {
printf("读取图片错误,请确定目录下是否有imread函数指定的图片存在~! \n");
return false;
}
imshow("原始图", srcImage);
//【2】创建和原始图一样的效果图,x重映射图,y重映射图
dstImage.create(srcImage.size(), srcImage.type());
map_x.create(srcImage.size(), CV_32FC1);
map_y.create(srcImage.size(), CV_32FC1);
//【3】双层循环,遍历每一个像素点,改变map_x & map_y的值
for (int j = 0; j < srcImage.rows; j++)
{
for (int i = 0; i < srcImage.cols; i++)
{
//改变map_x & map_y的值.
map_x.at<float>(j, i) = static_cast<float>(i);
map_y.at<float>(j, i) = static_cast<float>(srcImage.rows - j);
}
}
//【4】进行重映射操作
// opencv3:CV_INTER_LINEAR
// opencv4:INTER_LINEAR
remap(srcImage, dstImage, map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));
//【5】显示效果图
imshow("【程序窗口】", dstImage);
waitKey();
return 0;
}
Python版本代码
import cv2
import numpy as np
#【1】载入原始图
srcImage = cv2.imread("../images/car.jpg")
cv2.imshow("srcImage", srcImage)
#【2】创建和原始图一样的效果图,x重映射图,y重映射图
sp = srcImage.shape[:2]
map_x = np.zeros((sp[0],sp[1]),np.float32)
map_y = np.zeros((sp[0],sp[1]),np.float32)
#【3】双层循环,遍历每一个像素点,改变map_x & map_y的值
for y in range(0,int(sp[0]-1)):
for x in range(0,int(sp[1]-1)):
# 改变map_x & map_y的值.
map_x[y,x]=x
map_y[y,x]=sp[0]-y
#【4】进行重映射操作
dstImage=cv2.remap(srcImage, map_x, map_y, cv2.INTER_LINEAR, cv2.BORDER_CONSTANT)
#【5】显示效果图
cv2.imshow('dstImage',dstImage)
cv2.waitKey(0)
cv2.destroyAllWindows()