opencv中的重映射:remap()函数



 
 

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

C++:

void remap(InputArray src, OutputArray dst, InputArray map1, InputArray map2,

                    int interpolation, intborderMode = BORDER_CONSTANT,

                    const Scalar& borderValue = Scalar())

  • 第一个参数:输入图像,即原图像,需要单通道8位或者浮点类型的图像
  • 第二个参数:输出图像,即目标图像,需和原图形一样的尺寸和类型
  • 第三个参数:它有两种可能表示的对象:(1)表示点(x,y)的第一个映射;(2)表示CV_16SC2,CV_32FC1等
  • 第四个参数:它有两种可能表示的对象:(1)若map1表示点(x,y)时,这个参数不代表任何值;(2)表示                                     CV_16UC1,CV_32FC1类型的Y值

  • 第五个参数:插值方式,有四中插值方式:(1)INTER_NEAREST——最近邻插值

                                                                     (2)INTER_LINEAR——双线性插值(默认)

                                                                     (3)INTER_CUBIC——双三样条插值(默认)

                                                                     (4)INTER_LANCZOS4——lanczos插值(默认)

  • 第六个参数:边界模式,默认BORDER_CONSTANT
  • 第七个参数:边界颜色,默认Scalar()黑色

以下为函数应用及效果展示:


 
 
  1. #include <opencv2/opencv.hpp>
  2. using namespace cv;
  3. int main()
  4. {
  5. Mat srcImage = imread( "D:\\visual studio 2010\\Projects\\remap\\1.jpg");
  6. Mat dstImage,map_x,map_y;
  7. imshow( "",srcImage);
  8. //创建和原始图像一样的效果图,x重映射图,y重映射图
  9. dstImage.create(srcImage.size(),srcImage.type());
  10. map_x.create(srcImage.size(),CV_32FC1);
  11. map_y.create(srcImage.size(),CV_32FC1);
  12. //双层循环,遍历每一个像素点,改变map_x和map_y的值
  13. for( int j= 0;j<srcImage.rows;j++)
  14. {
  15. for( int i= 0;i<srcImage.cols ;i++)
  16. {
  17. //改变map_x和map_y的值
  18. map_x.at< float>(j,i) = static_cast< float>(srcImage.rows -i);
  19. map_y.at< float>(j,i) = static_cast< float>( srcImage.rows-j);
  20. }
  21. }
  22. //进行重映射操作
  23. remap(srcImage,dstImage,map_x,map_y,CV_INTER_LINEAR,BORDER_CONSTANT,Scalar( 255, 0, 0));
  24. //显示效果图
  25. imshow( "效果图",dstImage);
  26. waitKey( 0);
  27. return 0;
  28. }

  • 将第二个for循环修改为


 
 
  1. for( int i= 0;i<srcImage.cols ;i++)
  2. {
  3. //改变map_x和map_y的值
  4. //水平对称
  5. map_x.at< float>(j,i) = static_cast< float>( i);
  6. map_y.at< float>(j,i) = static_cast< float>( srcImage.rows-j);
  7. }
运行结果:



  • 将第二个for循环修改为:


 
 
  1. for( int i= 0;i<srcImage.cols ;i++)
  2. {
  3. //改变map_x和map_y的值
  4. //垂直对称
  5. map_x.at< float>(j,i) = static_cast< float>(srcImage.rows -i);
  6. map_y.at< float>(j,i) = static_cast< float>(j);
  7. }
运行结果为:


参考《OPENCV3编程入门》-毛星云


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值