首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图像配准与聚焦叠加

图像配准与聚焦叠加
EN

Stack Overflow用户
提问于 2019-09-16 04:51:47
回答 1查看 1K关注 0票数 0

背景:,我想为一个使用智能手机的焦点堆叠应用程序对齐图像。链接到图像:

堆栈中的第一个:1,最后一个堆栈:2,最后的叠加图像:3.

也就是说,图像名义上是相同的,但包含:

  1. 焦距在图像间移动时焦距的系统变化
  2. 放大率略有变化(智能手机功能随着焦点的变化!)
  3. 相机由于随机振动而轻微移动。

图像需要对齐焦点堆叠应用程序才能工作。

到目前为止,进度:,我使用OpenCV的findTransformECC()来实现对齐。在进行了一些实验之后,它工作得很好,例如,参见ECC图像对齐方法中的模式,它对于改进经纱矩阵的初始化非常有用:

  1. 像素级对齐图像
  2. 60秒处理8Mpix图像( 0.5Mpix图像1秒)(在3岁的带有OpenCV发布库的便携式PC上)

请参阅上面的叠加图像链接。

我简要地研究了一个特征检测器(SIFT)。它没有很好地对齐图像,大概是由于图像之间焦点的变化。

代码:

代码语言:javascript
复制
 int scale = 1;
 int scaleSmall = 4;
 float scaleDiff = scaleSmall / scale;

     for (i = 0; i< numImages; i++) {
        file = dir + image + to_string(i) + ".jpg";
        col[i] = imread(file);

        resize(col[i], z[i], Size(col[i].cols/scale, col[i].rows/scale));       
        cvtColor(z[i], zg[i], CV_BGR2GRAY);
        resize(zg[i], zgSmall[i],  Size(col[i].cols / scaleSmall, col[i].rows / scaleSmall));
     }

    // Set a 2x3 or 3x3 warp matrix depending on the motion model.
    // See https://www.learnopencv.com/image-alignment-ecc-in-opencv-c-python/
    // Define the motion model
    const int warp_mode = MOTION_HOMOGRAPHY;

    // Initialize the matrix to identity
    if (warp_mode == MOTION_HOMOGRAPHY) {
        warp_init = Mat::eye(3, 3, CV_32F);
        warp_matrix = Mat::eye(3, 3, CV_32F);
        warp_matrix_prev = Mat::eye(3, 3, CV_32F);
        scaleTX = (Mat_<float>(3, 3) << 1, 1, scaleDiff, 1, 1, scaleDiff, 1 / scaleDiff, 1 / scaleDiff, 1);
    }
    else {
        warp_init = Mat::eye(2, 3, CV_32F);
        scaleTX = Mat::eye(2, 3, CV_32F);
        warp_matrix = Mat::eye(2, 3, CV_32F);
        warp_matrix_prev = Mat::eye(2, 3, CV_32F);
        scaleTX = (Mat_<float>(2, 3) << 1, 1, scaleDiff, 1, 1, scaleDiff);
    }

    // Specify the number of iterations.
    int number_of_iterations = 5000;

    // Specify the threshold of the increment
    // in the correlation coefficient between two iterations
    double termination_eps = 1e-8;

    // Define termination criteria
    TermCriteria criteria(TermCriteria::COUNT + TermCriteria::EPS, number_of_iterations, termination_eps);

    for (i = 1; i < numImages; i++) {
        // Check images right size
        if (zg[0].rows < 10 || zg[1].rows < 10)
            return;

        // Run the ECC algorithm at start to get an initial guess. The results are stored in warp_matrix.
        if (i == 1) {
            findTransformECC(zgSmall[0], zgSmall[i], warp_init, warp_mode, criteria     );

            // See https://stackoverflow.com/questions/45997891/cv2-motion-euclidean-for-the-warp-mode-in-ecc-image-alignment-method
            warp_matrix = warp_init * scaleTX;
        }

        // Warp Matrix from previous iteration is used as initialisation  
        findTransformECC(zg[0], zg[i], warp_matrix, warp_mode,  criteria);

        if (warp_mode != MOTION_HOMOGRAPHY) {
            warpAffine(zg[i], ag[i], warp_matrix, zg[i].size(), INTER_LINEAR + WARP_INVERSE_MAP);
            warpAffine(z[i], acol[i], warp_matrix, zg[i].size(), INTER_LINEAR + WARP_INVERSE_MAP);
        }
        else {
            // Use warpPerspective for Homography
            warpPerspective(z[i], acol[i], warp_matrix, z[i].size(), INTER_LINEAR + WARP_INVERSE_MAP);
            warpPerspective(zg[i], ag[i], warp_matrix, zg[i].size(), INTER_LINEAR + WARP_INVERSE_MAP);
           }
        }
    }

问题:能否显著提高图像配准速度(使用相同的硬件)?

EN

回答 1

Stack Overflow用户

发布于 2019-09-18 12:43:34

至少有3项改进可以做到:

  1. 可能没有必要进行5000次迭代。试着把它限制在500。此外,将图像转换为梯度域可能会有所帮助。请参阅此GetGradient函数中的教程
  2. 您可以假设透视效果可以忽略不计,因此可以将warp_mode更改为MOTION_AFFINE,将自由度从8限制为6。
  3. 您也可以尝试另一种更快的方法,基于相位相关(频域)。在标准方法中,它只估计图像之间的平移,但您可以将它们转换到对数极坐标空间,以获得平移、旋转和尺度不变性。这个代码实现了第三种方法。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57950556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档