zoukankan      html  css  js  c++  java
  • opencv —— remap 重映射

    重映射的概念

    重映射,就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。

     

    实现重映射:remap 函数

    将图像进行重映射几何变换,基于的公式为:dst (x, y) = src ( map(x, y), map(x, y) )。即 map在(x,y)位置上存储的是目标像素的横坐标,map在(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 插值)

    • borderValue ,只有当 borderMode取值为 BORDER_CONSTANT 时,这个参数才会被使用,边界会被填充成 borderValue 指定的颜色。

     

    代码示例:

    #include<opencv.hpp>
    #include<iostream>
    using namespace std;
    using namespace cv;
    Mat src;
    int choice = 0;
    void change_choice(int, void*) {
        Mat dst;
        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++) {
                switch (choice){
                case 0://180°旋转
                    x_rows[j] = static_cast<float>(src.cols - j);
                    y_rows[j] = static_cast<float>(src.rows - i);
                    break;
                case 1://缩小为原来的 1/2
                    if (j > src.cols*0.25&&j<src.cols*0.75&&i>src.rows*0.25&&i < src.rows*0.75) {
                        x_rows[j] = static_cast<float>(2 * (j - src.cols*0.25));
                        y_rows[j] = static_cast<float>(2 * (i - src.rows*0.25));
                    }
                    break;
                }
            }
        }
        remap(src, dst, x_map, y_map, INTER_LINEAR);
        imshow("dst", dst);
    }
    int main() {
        src = imread("C:/Users/齐明洋/Desktop/1.jpg");
        imshow("src", src);
    
        namedWindow("dst");
        createTrackbar("choice", "dst", &choice, 1, change_choice);
        change_choice(0, 0);
        waitKey(0);
    }

    效果演示:

     

     

     

     

     

    借鉴博客:https://www.cnblogs.com/HL-space/p/10546595.html

    https://blog.csdn.net/weixin_39746114/article/details/82467458

     

  • 相关阅读:
    lodash源码分析之自减的两种形式
    lodash源码分析之NaN不是NaN
    lodash源码分析之Hash缓存
    lodash源码分析之compact中的遍历
    navigate15安装教程
    jmeter线程组调度器使用
    jmeter 注册选择文件编码格式有问题
    jmete插件下载
    jmeter linux 无gui模式分布式压测
    pycharm原码编辑界面快捷键
  • 原文地址:https://www.cnblogs.com/bjxqmy/p/12335777.html
Copyright © 2011-2022 走看看