image-processing - 在不使用重映射的情况下将 OpenCV 中的每个像素向右移动(1px)?

标签 image-processing opencv remap

我想将图像中的每个像素向右移动 1px,下面是我用来进行重新映射转换的 map 。

这种方法需要的时间比进行这种简单转换所需的时间要多得多。我可以使用 cv 函数吗?或者我只是将图像拆分为 2 个图像,一个是 src.cols-1 像素宽,另一个是 1 像素宽,然后将它们复制到新图像?

void update_map()
{
    for( int j = 0; j < src.cols; j++ ){
       for( int i = 0; i < src.rows; i++ ){
         if (j == src.cols-1)
             mat_x_Rotate.at<float>(i,j) = 0;
         else
            mat_x_Rotate.at<float>(i,j) = j + 1;
            mat_y_Rotate.at<float>(i,j) = i;
         }
     }
}

最佳答案

你可以做些什么来提高你的表现:

  • remap 对于这个目的来说是矫枉过正。直接复制像素比定义整个重映射变换然后使用它更有效。
  • 切换循环顺序:遍历行,然后遍历列。 (OpenCV 的 Mat 以行优先顺序存储,因此先遍历列非常缓存不友好)
  • 使用Mat::ptr()直接访问同一行中的像素,作为 C 样式数组。 (与使用 at<>() 相比,这是一个很大的性能胜利,它可能会为每次访问做检查索引之类的事情)
  • 带上你的if语句跳出内循环,并处理列 0分别。

作为替代方案:是的,如上所述,将图像拆分成多个部分并复制到新图像可能与直接复制一样高效。

关于image-processing - 在不使用重映射的情况下将 OpenCV 中的每个像素向右移动(1px)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11993395/

相关文章:

python - 无法重建分解图像

c++ - openCV undefined symbol _cvCvtColor

oracle - 如何使用 REMAP_TABLE 重命名多个表名

c++ - Opencv C++错误,无法获取某些像素的像素强度值

opencv - 改进哈里斯角检测器的结果

autohotkey - AHK 将鼠标中键重新映射到其他按钮

vim - 使用 VIM,如何将方向键从右手重新映射到左手?

algorithm - 如何使用 Haar 小波检测图像上的线条?

c++ - OpenCV:如何从提供的图片中检测粗红线及其轮廓

algorithm - 如何判断两张照片是否相同,只是存在一些亮度差异