Opencv(C++)笔记--像素重映射

本文介绍了OpenCV中的图像重映射概念,通过API `cv::remap` 实现图像的缩放、翻转等变换。提供了一个实例代码,展示了如何创建并更新映射矩阵,以及如何应用这些映射进行图像处理。代码中根据用户输入实现不同类型的图像变形,包括图像的缩小、左右颠倒、上下颠倒和上下左右颠倒。
摘要由CSDN通过智能技术生成

目录

1--概念

2--Opencv API

3--实例代码


1--概念

        从图像中的一个像素点获取其像素值,并将这个像素值映射到新图像中另一个像素点位置的过程;

        为了完成整个映射过程,有时需对非整数像素位置进行插值,因为源图像和目标图像之间并不总是存在一对一的像素对应关系。

2--Opencv API

cv::remap(src, dst, map_x, map_y, cv::INTER_LINEAR, cv::BORDER_CONSTANT, cv::Scalar(0, 255, 255));

3--实例代码

# include <opencv2/opencv.hpp>
# include <cstdio>
# include <iostream>

void update_map(cv::Mat src, cv::Mat map_x, cv:: Mat map_y, int idx){
    for(int row = 0; row < map_x.rows; row++){
        for(int col = 0; col < map_x.cols; col++){
            switch (idx){
                case 0: // 缩小
                    if (col > (map_x.cols*0.25) && col < (map_x.cols*0.75) && row > (map_x.rows*0.25) && row < (map_x.rows*0.75)){
                        map_x.at<float>(row, col) = (float)(2 * (col - (map_x.cols*0.25) + 0.5));
                        map_y.at<float>(row, col) = (float)(2 * (row - (map_x.rows*0.25) + 0.5));
                    }
                    else{
                        map_x.at<float>(row, col) = 0;
                        map_y.at<float>(row, col) = 0;
                    }
                    break;

                case 1: // 左右颠倒
                    map_x.at<float>(row, col) = (float)(map_x.cols - col - 1);
                    map_y.at<float>(row, col) = (float)(row);
                    break;

                case 2: // 上下颠倒
                    map_x.at<float>(row, col) = (float)(col);
                    map_y.at<float>(row, col) = (float)(map_x.rows - row - 1);
                    break;
                
                case 3: // 上下左右颠倒
                    map_x.at<float>(row, col) = (float)(map_x.cols - col - 1);
                    map_y.at<float>(row, col) = (float)(map_x.rows - row - 1);
                    break;
            }

        }
    }
}

int main(int argc, char** argv){

    cv::Mat src;
    cv::Mat map_x;
    cv::Mat map_y;
    cv::Mat dst;
    int idx;

    src = cv::imread("C:/Users/Liujinfu/Desktop/opencv_bilibili/test1.jpg");
    if (src.empty()){
        printf("could not load image..\n");
        return -1;
    }
    cv::imshow("input", src);

    map_x.create(src.size(), CV_32FC1);
    map_y.create(src.size(), CV_32FC1);
    
    int c = 0;
    while(true){
        c = cv::waitKey(10);
        if(c == 27){ // esc键
            break;
        }
        idx = c % 4;
        update_map(src, map_x, map_y, idx);
        cv::remap(src, dst, map_x, map_y, cv::INTER_LINEAR, cv::BORDER_CONSTANT, cv::Scalar(0, 255, 255));
        cv::imshow("output", dst);
    }

    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值