请大神们帮忙解释有关图像处理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呢?请大神给小弟解惑,谢谢!

假设对一张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博客

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632