OpenCV图像重映射

OpenCV图像重映射,我们学习了如何读取和修改图像的像素值,本文来看看如何通过移动像素修改图像的外观。这个过程不会修改像素值,而是把每个像素的位置重新映射到新的位置。这可用来创建图像特效,或者修正因镜片等原因导致的图像扭曲。

如何实现

要使用OpenCV的remap函数,首先需要定义在重映射处理中使用的映射参数,然后把映射参数应用到输入图像。很明显,定义映射参数的方式将决定产生的效果。这里定义一个转换函数,在图像上创建波浪形效果:

        // 重映射图像,创建波浪形效果
        void wave(const cv::Mat &image, cv::Mat &result) {

          // 映射参数
          cv::Mat srcX(image.rows, image.cols, CV_32F);
          cv::Mat srcY(image.rows, image.cols, CV_32F);

          // 创建映射参数
          for (int i=0; i<image.rows; i++) {
            for (int j=0; j<image.cols; j++) {

              // (i, j)像素的新位置
              srcX.at<float>(i, j)= j; // 保持在同一列
                                        // 原来在第i行的像素,现在根据一个正弦曲线移动
              srcY.at<float>(i, j)= i+5*sin(j/10.0);
            }
          }

          // 应用映射参数
          cv::remap(image,                  // 源图像
                    result,                // 目标图像
                    srcX,                   // x映射
                    srcY,                   // y映射
                    cv::INTER_LINEAR);   // 填补方法
        }

得到的结果如下所示
OpenCV图像重映射

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!