我想将图像中的每个像素向右移动 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/