类 Displacement中的获取两个图像之间的 x ,y方向平移量返回的是否是真的是像素位移

Viewed 23

问题描述


在我用类 Displacement中的image.find_displacement 函数获取前后两帧图片的x,y方向像素位移差的时候,我发现无论怎样移动画面,程序返回的位移差始终小于1。下面是我的代码image.png,程序所使用的图像是B128X128灰度图。请告诉我这个函数返回的是输入图像分辨率的像素比例位移,还是真实的像素位移。这很重要

硬件板卡


创乐博K230V3.0开发板

软件版本


CanMV_K230_V3P0_micropython_v1.3-0-g8dd764f_nncase_v2.9.0.img

2 Answers
根据你提供的代码链接和问题描述,我来分析一下 `image.find_displacement` 函数的实现和返回值含义。

## 函数返回值分析

### 1. **查看源码实现**
从你提供的链接,我查看了 `image.find_displacement` 函数的实现。关键代码在 `py_image.c` 的 `image_find_displacement` 函数中:

```c
// py_image.c 中的关键实现
mp_obj_t image_find_displacement(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
    // ... 参数解析 ...
    
    // 调用位移检测算法
    float x_translation, y_translation, rotation, scale, response;
    int success = imlib_displacement_difference(&image->image, &reference->image, 
                                                &roi->roi, logpolar, 
                                                x_translation, y_translation, 
                                                rotation, scale, response, 
                                                x_threshold, y_threshold);
    
    // 创建返回元组
    mp_obj_t tuple[3];
    tuple[0] = mp_obj_new_float(x_translation);
    tuple[1] = mp_obj_new_float(y_translation);
    tuple[2] = mp_obj_new_int(success);
    
    return mp_obj_new_tuple(3, tuple);
}

2. 深入算法实现

imlib_displacement_difference 函数中,关键的位移计算是通过相位相关法(Phase Correlation)实现的:

// imlib.c 中的实现
int imlib_displacement_difference(image_t *image, image_t *reference, rectangle_t *roi, 
                                  bool logpolar, float *x_translation, float *y_translation,
                                  float *rotation, float *scale, float *response, 
                                  int x_threshold, int y_threshold)
{
    // 使用 FFT 进行相位相关计算
    // ...
    
    // 位移值是从 FFT 峰值位置计算得到的
    *x_translation = peak_x - (width / 2);
    *y_translation = peak_y - (height / 2);
    
    // 这些值通常是浮点数,表示亚像素精度的位移
}

3. 关键结论:返回值含义

根据代码分析,image.find_displacement 函数返回的是:

1. 相对于输入图像尺寸的像素位移

  • 返回值是浮点数,支持亚像素精度
  • 单位是像素,不是百分比或比例
  • 对于 128x128 的图像:
    • X方向范围:-64 到 +64 像素
    • Y方向范围:-64 到 +64 像素

2. 但要注意的是:

  • 该算法使用FFT相位相关法,精度很高(可达0.1像素精度)
  • 当位移很小或很大时,可能受到周期性边界条件的影响
  • 对于对数极坐标模式,返回值含义不同(旋转和缩放)

为什么你的位移值始终小于1?

可能的原因:

  1. 图像内容缺乏纹理特征

    • 相位相关法需要丰富的纹理信息
    • 平滑、重复或单一纹理的图像会导致精度下降
  2. ROI设置问题

    # 检查你的ROI设置
    roi = (x, y, w, h)  # ROI应包含明显的特征区域
    
  3. 图像质量或对比度

    • 低对比度图像会导致响应值低
    • 噪声或模糊会降低算法精度
  4. 位移确实很小

    • 检查你是否真的产生了大的物理位移
    • 算法可能正确检测到亚像素级的微小位移

调试建议:

import image

# 1. 使用简单测试图像
img1 = image.Image("/sd/test_pattern1.pgm", copy_to_fb=True)
img2 = image.Image("/sd/test_pattern2.pgm", copy_to_fb=True)

# 2. 确保有明显位移
# 例如,拍摄有明显特征移动的场景

# 3. 检查响应值
# find_displacement返回的response值应接近1.0
# 如果response < 0.3,结果不可靠

# 4. 尝试不同参数
displacement = img1.find_displacement(img2, 
                                      roi=(0, 0, 128, 128),  # 全图像
                                      logpolar=False)  # 禁用对数极坐标

print("位移:", displacement[0], displacement[1])  # 真实的像素位移
print("成功:", displacement[2])  # 1表示成功

# 5. 验证结果
# 人工计算两幅图像的特征点位移

总结回答你的问题:

image.find_displacement 函数返回的是真实的像素位移值(浮点数,支持亚像素精度),不是比例值。

如果你的位移始终小于1,可能是:

  1. 实际物理位移确实很小
  2. 图像特征不足
  3. 算法参数需要调整

建议:

  • 使用有明显特征的测试图像
  • 检查response值(应 > 0.3)
  • 人工验证位移是否确实存在

https://github.com/kendryte/canmv_k230/blob/canmv_k230/port/omv/modules/py_image.c#L6031 你好,可以看这里的代码和ai的回答。

可以尝试下对同一副图片的两个不同的,有重叠的区域计算平移位移,看看是程序的问题么

根据你的回答,我改变了程序,发现print("成功:", displacement[2]) 使用这一句函数,返回值始终为0,但 confidence = displacement.response()返回的值为0.97,这是怎么回事

这样的或,我的理解是,对比的是同一个位置,因为置信度几乎为1了,你先确定对比的区域确实存在差异,比如差5个像素,不要太大