We唯有自己强大 2021-05-22 08:57 采纳率: 50%
浏览 43
已采纳

请大神们帮忙解释有关图像处理remap代码的问题

#include #include using namespace std; using namespace cv; int main() { Mat src, dst,map_x, map_y; src = imread("D:\\sof\\img\\123.jpg"); imshow("原图", src); //flip(src, dst, 1); /*remap(src,dst,)*/ /*dst.create(src.size(), src.type()); map_x.create(src.size(), CV_32FC1); map_y.create(src.size(), CV_32FC1); for (int j = 0; j < src.rows; j++) { for (int i = 0; i < src.cols; i++) { map_x.at(j, i) = float(i); map_y.at(j, i) = float(src.rows - j); } } remap(src, dst, map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));*/ imshow("效果图", dst); waitKey(0); return 0; } 上面代码是用opencv库中的remap实现,对图像的垂直翻转。但是for循环内的那两行代码小弟怎么想都不理解啥意思,正常做垂直翻转的话,不应该是将原矩阵第一列第一行的标量数值移动到目标矩阵第一列最后一行的位置吗,然后第二行移动到倒数第二行……直至行和列全部遍历完。而代码中 map_x.at(j, i) = float(i); map_y.at(j, i) = float(src.rows - j); 这两行的意思则将当前行和列的值转化为浮点数依次去填充到目标矩阵的相反位置,为什么要将行数和列数去赋给像素标量值呢,但是最后程序运行结果确实是使图像垂直翻转了。小弟实在想不明白。 还有remap与flip()函数有什么区别呢,功能基本上都是相同的啊?有flip这么简单高效率的api为什么还要做remap这个复杂低效率的api呢?请大神给小弟解惑,谢谢!

  • 写回答

2条回答 默认 最新

  • 关注

    假设对一张10*10的图片进行上下重映射,map_x作用是记录列坐标,map_y作用是记录行坐标。

    输出map_x,map_y:

    map_x:

    map_y:

    我们可以看到,在x方向从左到右逐渐增大排列,在y方向上到下减小排列,

    将map_y,map_x组合,以坐标形式输出,则结果为

    而原图的坐标为:

    对比发现,原图坐标和map_y,map_x组合坐标发生了上下翻转。

    然后根据坐标,把原图坐标对应的像素点一一映射到转换图上,就是上下翻转变换后的图像,这也是图片重映射的原理。参考OpenCV关于重映射map_x,map_y的疑惑_ganwenbo2011的博客-CSDN博客

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分