图像可形变配准的Demons方法

图像的可形变配准分为参数法和非参数法,参数法例如仿射变换、B-spline based FFD等方法通过对形变的参数化表示,减小求解的变量个数,但是也限制了形变复杂程度。非参数化的方法将图像的形变表示成位移场,每一个像素都有一个位移,可以表示更加复杂的形变,但是要求解的变量也更多。

1, Thirion’s Demons

Demons就是一种著名的非参数化可形变配准方法。它最早来自于光流算法(optical flow),光流是用来估计视频图像中相邻的两帧图像目标的位移,也就是目标移动的速度,其基本方程为

v=(sm)s|s|2 (公式1)

其中 s 是第一帧图像, m 是第二帧图像。

光流算法有两个基本假设:1, 相邻两帧图像中目标的灰度值不变。2, 相邻两帧之间目标的位移比较小。

在图像配准中, s 也叫做静止图像, m 也叫作移动图像。配准的目标是找到一个从 s m 的变换以确定像素之间的对应关系。Thirion将光流算法引入到图像配准中,为了防止图像梯度为0时计算出现问题,在分母中加了一项图像灰度差:

u=(sm)s|s|2+(sm)2 (公式2)

该公式得到一个小的位移量,在Demons算法中,通过该公式的多次迭代并且用高斯滤波器对位移场进行平滑处理,得到配准所需的变化。其基本代码如下:

S=im2double(imread('images/lenag2.png')); % static image
M=im2double(imread('images/lenag2.png')); % moving image
% The transformation fields
Tx=zeros(size(M)); Ty=zeros(size(M));
for itt=1:200
        % Difference image between moving and static image
        Idiff=M-S;

        % Default demon force, (Thirion 1998)
        Ux = -(Idiff.*Sx)./((Sx.^2+Sy.^2)+Idiff.^2);
        Uy = -(Idiff.*Sy)./((Sx.^2+Sy.^2)+Idiff.^2);

        % When divided by zero
        Ux(isnan(Ux))=0; Uy(isnan(Uy))=0;

        % Smooth the transformation field
        Uxs=3*imfilter(Ux,Hsmooth);
        Uys=3*imfilter(Uy,Hsmooth);

        % Add the new transformation field to the total transformation field.
        Tx=Tx+Uxs;
        Ty=Ty+Uys;
        M=movepixels(I1,Tx,Ty); 
end

2, Wang’s Demons
Thirion’s Demons 只使用了静止图像的梯度计算形变的力(即 u⃗  ),为了使配准过程更快,Wang’s Demons既使用静止图像的梯度,也使用运动图像的梯度来定义形变力。

u⃗ =(sm)×(s|s|2+α2(sm)2+m|m|2+α2(sm)2) (公式3)

通过使用静止图像和运动图像两方面的力,算法可以收敛的更快。其中

  • 21
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
Kinect v2可以生成深度图像和彩色图像,但是深度图像和彩色图像的分辨率不同,因此需要进行图像配准才能将它们对齐。 一种简单的图像配准方法是使用OpenCV库中的函数cv::registerTranslation()。这个函数可以通过计算两张图像之间的平移量来实现图像配准。具体的步骤如下: 1. 读取深度图像和彩色图像。 2. 将深度图像和彩色图像转换为灰度图像。 3. 使用cv::registerTranslation()函数计算两张灰度图像之间的平移量。 4. 将深度图像根据计算出的平移量进行平移,使其与彩色图像对齐。 以下是示例代码: ``` #include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { // 读取深度图像和彩色图像 Mat depth = imread("depth.png", IMREAD_ANYDEPTH); Mat color = imread("color.png"); // 将深度图像和彩色图像转换为灰度图像 Mat grayDepth, grayColor; cvtColor(depth, grayDepth, COLOR_GRAY2BGR); cvtColor(color, grayColor, COLOR_BGR2GRAY); // 计算两张灰度图像之间的平移量 Mat T = Mat::eye(2, 3, CV_32F); Point2f shift = phaseCorrelate(grayDepth, grayColor); T.at<float>(0, 2) = shift.x; T.at<float>(1, 2) = shift.y; // 将深度图像根据计算出的平移量进行平移 Mat registeredDepth; warpAffine(depth, registeredDepth, T, color.size()); // 显示结果 imshow("Depth", depth); imshow("Color", color); imshow("Registered Depth", registeredDepth); waitKey(); return 0; } ``` 在这个示例代码中,我们首先读取深度图像和彩色图像,并将它们转换为灰度图像。然后,我们使用cv::phaseCorrelate()函数计算两张灰度图像之间的平移量,并将平移量转换为仿射变换矩阵。最后,我们使用cv::warpAffine()函数将深度图像根据计算出的平移量进行平移,并将结果显示出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值