OpenCv学习21——像素重映射

  1. 像素重映射简介:

    像素重映射简单的说就是把输入图像中各个像素按照一定的规则映射到另外一张图象的对应位置上去,形成一张新的图像;例如我们平时生活中的照镜子的行为也是一种重映射。
    在这里插入图片描述

  2. 像素重映射中用到的相关API

    CV_EXPORTS_W void remap( InputArray src//输入图像, 
    						 OutputArray dst,//输出图像
                             InputArray map1,//对应的x方向映射表
                             InputArray map2,//对应的y方向映射表
                             int interpolation, //选择的插值方法,常见线性插值,可选择立方插值
                             int borderMode = BORDER_CONSTANT,//通常我们选择该参数为BORDER_CONSTANT
                             const Scalar& borderValue = Scalar());//color
    
  3. 实验代码及程序分析:

    #include "stdafx.h"
    #include "iostream"
    #include "opencv2\opencv.hpp"
    
    using namespace std;
    using namespace cv;
    
    void image_remap(void);
    
    int index = 0;
    Mat src, dst, map_x, map_y;
    
    int main()
    {
    	src = imread("G:/He/opencv_images/test.jpg");
    	if (src.empty())
    	{
    		cout << "could not load the images..." << endl;
    		return -1;
    	}
    	namedWindow("input_images", CV_WINDOW_AUTOSIZE);
    	namedWindow("output_images", CV_WINDOW_AUTOSIZE);
    	imshow("input_images", src);
    	map_x.create(src.size(), CV_32FC1);
    	map_y.create(src.size(), CV_32FC1);
    	int c = 0;
    	while (1)
    	{
    		c = waitKey(500);
    		index = c % 4;
    		if ((char)c == 27)break;
    		else
    		{
    			image_remap();
    			remap(src, dst, map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 255));
    			imshow("output_images", dst);
    		}
    	}
    	waitKey(0);
    	destroyAllWindows();
    
    	return 0;
    }
    
    
    
    void image_remap(void)
    {
    	for (int col = 0; col < src.cols; col++)
    	{
    		for (int row = 0; row < src.rows; row++)
    		{
    			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;
    			}
    		}
    	}
    }
    
    
    

在这里插入图片描述
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值