OpenCV 像素重映射(cv::remap)

简介: OpenCV 像素重映射(cv::remap)

像素重映射介绍


什么是像素重映射?


简单点说就是把输入图像中各个像素按照一定的规则映射到另外一张图像的对应位置上去,形成一张新的图像。


类似于下图我们的函数映射关系



我们可以构造出图像的映射关系公式,如下图



其中 g(x,y)是重映射之后的图像,h(x,y)是功能函数,f是源图像


举例说明


假设有映射函数



上面函数映射关系为:x方向进行对调


那么原图像是:



则x方向调对过后图像就是这样的



映射的一般样例


  • 缩小一半



  • Y方向对调



  • X方向对调



  • XY方向同时对调



相关API


remap


函数原型:


Remap(
  InputArray src,// 输入图像
  OutputArray dst,// 输出图像
  InputArray  map1,// x 映射表 CV_32FC1/CV_32FC2
  InputArray map2,// y 映射表
  int interpolation,// 选择的插值方法,常见线性插值,可选择立方等
  int borderMode,// BORDER_CONSTANT
  const Scalar borderValue// color 
)


代码示例







#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>  
using namespace std;
using namespace cv;
Mat src, dst, map_x, map_y;
const char* OUTPUT_TITLE = "remap demo";
int index = 0;
void update_map(void);
int main(int argc, char** argv)
{
  src = imread("./test2.jpg");
  if (!src.data) {
    printf("could not load image...\n");
    return -1;
  }
  char input_win[] = "input image";
  namedWindow(input_win, CV_WINDOW_AUTOSIZE);
  namedWindow(OUTPUT_TITLE, CV_WINDOW_AUTOSIZE);
  imshow(input_win, src);
  map_x.create(src.size(), CV_32FC1);
  map_y.create(src.size(), CV_32FC1);
  int c = 0;
  while (true) {
    c = waitKey(500);
    if ((char)c == 27) {
      break;
    }
    index = c % 4;
    update_map();
    remap(src, dst, map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 255, 255));
    imshow(OUTPUT_TITLE, dst);
  }
  return 0;
}
// 映射关系更新函数
void update_map(void) {
  for (int row = 0; row < src.rows; row++) {
    for (int col = 0; col < src.cols; col++) {
      switch (index) {
      case 0:
        if (col > (src.cols * 0.25) && col <= (src.cols*0.75) && row > (src.rows*0.25) && row <= (src.rows*0.75)) {
          map_x.at<float>(row, col) = 2 * (col - (src.cols*0.25));
          map_y.at<float>(row, col) = 2 * (row - (src.rows*0.25));
        }
        else {
          map_x.at<float>(row, col) = 0;
          map_y.at<float>(row, col) = 0;
        }
        break;
      case 1:
        map_x.at<float>(row, col) = (src.cols - col - 1);
        map_y.at<float>(row, col) = row;
        break;
      case 2:
        map_x.at<float>(row, col) = col;
        map_y.at<float>(row, col) = (src.rows - row - 1);
        break;
      case 3:
        map_x.at<float>(row, col) = (src.cols - col - 1);
        map_y.at<float>(row, col) = (src.rows - row - 1);
        break;
      }
    }
  }
}
相关文章
|
存储 Cloud Native Linux
OpenCV 图像像素运算操作
OpenCV 图像像素运算操作
|
9月前
|
API C++ 计算机视觉
【opencv3】鼠标框选矩形并显示当前像素点坐标和矩形中心点坐标C++
【opencv3】鼠标框选矩形并显示当前像素点坐标和矩形中心点坐标C++
|
7月前
|
机器学习/深度学习 人工智能 算法
Python在计算机视觉(CV)中扮演重要角色,得益于其丰富的库如OpenCV、Pillow和Scikit-image。
【7月更文挑战第5天】Python在计算机视觉(CV)中扮演重要角色,得益于其丰富的库如OpenCV、Pillow和Scikit-image。CV涉及图像处理、模式识别和机器学习,用于图像理解和生成。Python的跨平台特性和活跃社区使其成为CV的理想工具。基本流程包括图像获取、预处理、特征提取、分类识别及图像生成。例如,面部识别通过预处理图像,使用如`cv2.CascadeClassifier`进行检测;物体检测类似,但需适应不同目标;图像生成则利用GAN创造新图像。
93 4
|
6月前
|
计算机视觉 索引
OpenCV读取视频失败<无可用信息,未为 opencv_world453.dll 加载任何符号> cv::VideoCapture
本文介绍了解决OpenCV读取视频失败的错误,指出问题通常由视频路径错误或摄像头索引错误导致,并提供了相应的解决方法。
OpenCV读取视频失败<无可用信息,未为 opencv_world453.dll 加载任何符号> cv::VideoCapture
|
6月前
|
计算机视觉
OpenCV 图像类型标识符 CV_<bit_depth><S|U|F>C<number_of_channels>
OpenCV 图像类型标识符 CV_<bit_depth><S|U|F>C<number_of_channels>
58 0
|
8月前
|
计算机视觉
OpenCV图像像素值统计
OpenCV图像像素值统计
|
8月前
|
计算机视觉
OpenCV图像像素逻辑操作
OpenCV图像像素逻辑操作
|
计算机视觉
OpenCV-模板匹配cv::matchTemplate
OpenCV-模板匹配cv::matchTemplate
143 0
|
8月前
|
计算机视觉 C++
【见微知著】OpenCV中C++11 lambda方式急速像素遍历
【见微知著】OpenCV中C++11 lambda方式急速像素遍历
82 0
|
8月前
|
存储 计算机视觉
OpenCV3.1中读写图像与读写像素
OpenCV3.1中读写图像与读写像素
39 0