2011-05-25 17:21

非刚性图像配准 matlab简单示例 demons算法,

% Clean clc; clear all; close all;

% Compile the mex files %compile_c_files

% Read two images I1=im2double(imread('ssftrinew1.png')); 
I2=im2double(imread('ssftri.png'));

% Set static and moving image S=I2; M=I1;

% Alpha (noise) constant alpha=2.5;

% Velocity field smoothing kernel Hsmooth=fspecial('gaussian',[60 60],10);

% The transformation fields Tx=zeros(size(M)); Ty=zeros(size(M)); Tz=zeros(size(M));

[Sy,Sx] = gradient(S); 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);

% Extended demon force. With forces from the gradients from both         % moving as static image. (Cachier 1999, He Wang 2005)         [My,Mx] = gradient(M);         Ux = -Idiff.*  ((Sx./((Sx.^2+Sy.^2)+alpha^2*Idiff.^2))+(Mx./((Mx.^2+My.^2)+alpha^2*Idiff.^2)));        
Uy = -Idiff.* 
((Sy./((Sx.^2+Sy.^2)+alpha^2*Idiff.^2))+(My./((Mx.^2+My.^2)+alpha^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,Tz,0);         M=movepixels_2d_double(I1,Tx,Ty,0); end gridelment=gridshow(); gridelment=movepixels_2d_double(im2double(gridelment),Tx,Ty,0); subplot(1,3,1), imshow(I1,[]); title('image 1'); subplot(1,3,2), imshow(I2,[]); title('image 2'); subplot(1,3,3), imshow(M,[]); title('Registered image 1'); figure,subplot(131),imshow(I1),subplot(132),imshow(abs(I2-M)),subplot(133),imshow(abs(I2-I1)) figure,imshow(gridelment)

function gridelment=gridshow() gridelment=ones(256,256)*255; for i=1:5:256     gridelment(i,:)=0;     end for j=1:5:256         gridelment(:,j)=0; end gridelment=uint8(gridelment); imshow(gridelment);

function Iout=movepixels_2d_double(Iin,Tx,Ty,mode) % This function movepixels, will translate the pixels of an image %  according to x and y translation images (bilinear interpolated). % %  Iout = movepixels_2d_double(I,Tx,Ty,mode); % % Inputs; %   Tx, Ty: The transformation images, describing the %             (backwards) translation of every pixel in x and y direction. %   mode: If 0: linear interpolation and outside pixels set to nearest pixel %            1: linear interpolation and outside pixels set to zero %            (cubic interpolation only supported by compiled mex file) %            2: cubic interpolation and outsite pixels set to nearest pixel %            3: cubic interpolation and outside pixels set to zero % % Outputs, %   Iout : The transformed image % % Function is written by D.Kroon University of Twente (February 2009)   % Make all x,y indices [x,y]=ndgrid(0:size(Iin,1)-1,0:size(Iin,2)-1);

% Calculate the Transformed coordinates Tlocalx = x+Tx; Tlocaly = y+Ty;

% All the neighborh pixels involved in linear interpolation. xBas0=floor(Tlocalx);
yBas0=floor(Tlocaly); xBas1=xBas0+1;           yBas1=yBas0+1;

% Linear interpolation constants (percentages) xCom=Tlocalx-xBas0;
yCom=Tlocaly-yBas0; perc0=(1-xCom).*(1-yCom); perc1=(1-xCom).*yCom; perc2=xCom.*(1-yCom); perc3=xCom.*yCom;

% limit indexes to boundaries check_xBas0=(xBas0<0)|(xBas0>(size(Iin,1)-1)); check_yBas0=(yBas0<0)|(yBas0>(size(Iin,2)-1)); xBas0(check_xBas0)=0;
yBas0(check_yBas0)=0;
check_xBas1=(xBas1<0)|(xBas1>(size(Iin,1)-1)); check_yBas1=(yBas1<0)|(yBas1>(size(Iin,2)-1)); xBas1(check_xBas1)=0;
yBas1(check_yBas1)=0;

Iout=zeros(size(Iin)); for i=1:size(Iin,3);        Iin_one=Iin(:,:,i);     % Get the intensities     intensity_xyz0=Iin_one(1+xBas0+yBas0*size(Iin,1));     intensity_xyz1=Iin_one(1+xBas0+yBas1*size(Iin,1));     intensity_xyz2=Iin_one(1+xBas1+yBas0*size(Iin,1));     intensity_xyz3=Iin_one(1+xBas1+yBas1*size(Iin,1));     % Make pixels before outside Ibuffer mode     if(mode==1||mode==3)         intensity_xyz0(check_xBas0|check_yBas0)=0;         intensity_xyz1(check_xBas0|check_yBas1)=0;         intensity_xyz2(check_xBas1|check_yBas0)=0;         intensity_xyz3(check_xBas1|check_yBas1)=0;     end     Iout_one=intensity_xyz0.*perc0+intensity_xyz1.*perc1+intensity_xyz2.*perc2+intensity_xyz3.*perc3;     Iout(:,:,i)=reshape(Iout_one, [size(Iin,1) size(Iin,2)]); end

非刚性图像配准 matlab简单示例 demons算法的更多相关文章

  1. QT创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束的简单示例

    QT创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束的简单示例 部分代码: // 创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束 QMenu *pDialog = mBar->ad ...

  2. 【计算机视觉】图像配准(Image Registration)

    (Source:https://blog.sicara.com/image-registration-sift-deep-learning-3c794d794b7a)  图像配准方法概述 图像配准广泛 ...

  3. 图像配准:从SIFT到深度学习

      图像配准(Image Registration)是计算机视觉中的基本步骤.在本文中,我们首先介绍基于OpenCV的方法,然后介绍深度学习的方法. 什么是图像配准 图像配准就是找到一幅图像像素到另一 ...

  4. CV 两幅图像配准

    http://www.cnblogs.com/Lemon-Li/p/3504717.html 图像配准算法一般可分为: 一.基于图像灰度统计特性配准算法:二.基于图像特征配准算法:三.基于图像理解的配 ...

  5. PCA检测人脸的简单示例_matlab实现

    PCA检测人脸的简单示例,matlab R2009b上实现训练:训练用的20副人脸: %训练%Lx=X'*Xclear;clc;train_path='..\Data\TrainingSet\';ph ...

  6. 【图像配准】基于互信息的图像配准算法:MI、EMI、ECC算法

    简单介绍: 基于互信息的图像配准算法以其较高的配准精度和广泛的适用性而成为图像配准领域研究的热点之中的一个.而基于互信息的医学图像配准方法被觉得是最好的配准方法之中的一个.基于此.本文将介绍简单的基于 ...

  7. 【Canvas】(1)---概述+简单示例

    Canvas---概述+简单示例 如果通俗的去理解Canvas,我们可以去理解成它类似于我们电脑自带的画图工具一样,canvas首先是选择一块画布,然后在这个画布上描绘我们想画的东西,画好后展示给用户 ...

  8. 【图像配准】基于灰度的模板匹配算法(一):MAD、SAD、SSD、MSD、NCC、SSDA、SATD算法

    简介: 本文主要介绍几种基于灰度的图像匹配算法:平均绝对差算法(MAD).绝对误差和算法(SAD).误差平方和算法(SSD).平均误差平方和算法(MSD).归一化积相关算法(NCC).序贯相似性检测算 ...

  9. Opencv探索之路(二十):制作一个简易手动图像配准工具

    近日在做基于sift特征点的图像配准时遇到匹配失败的情况,失败的原因在于两幅图像分辨率相差有点大,而且这两幅图是不同时间段的同一场景的图片,所以基于sift点的匹配已经找不到匹配点了.然后老师叫我尝试 ...

随机推荐

  1. Python 学习日志(一)

    第一天: (一)安装Python3.3: (二)试运行: 1.在IDLE中输入:print("Hello,world"); //回车查看结果 2.使用"File" ...

  2. MYSQL SHOW VARIABLES简介

    原文地址:http://www.2cto.com/database/201108/100546.html mysqld服务器维护两种变量.全局变量影响服务器的全局操作.会话变量影响具体客户端连接相关操 ...

  3. percona-xtrabackup安装及使用教程

    安装percona-xtrabackup依赖包(前提已安装mysql) yum -y install perl-CPAN perl-DBD-MySQL perl make gcc gcc-c++ pa ...

  4. easyui源码翻译1.32--SplitButton(分割按钮)

    前言 扩展自$.fn.linkbutton.defaults.用于$.fn.splitbutton.defaults重写默认值对象.下载该插件翻译源码 类似菜单按钮,分割按钮也与linkbutton和 ...

  5. Android USB Host与HID通讯 (一)

    去年9月份来到现在的公司,接到新公司的第一个项目就是Android USB Host与HID通讯,当时也什么都不懂,就拿着google的api 开发指南 (http://developer.andro ...

  6. html5 高级动画精灵

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  7. paip.无线路由器的无线接入WAN方式WDS设置大法

    paip.无线路由器的无线接入WAN方式WDS设置大法 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn. ...

  8. 【HDOJ】1262 寻找素数对

    典型的二分决策树.而且本身两数和是偶数. #include <stdio.h> #include <string.h> #define MAXNUM 10001 int isP ...

  9. MapReduce的数据流程、执行流程

    MapReduce的数据流程: 预先加载本地的输入文件 经过MAP处理产生中间结果 经过shuffle程序将相同key的中间结果分发到同一节点上处理 Recude处理产生结果输出 将结果输出保存在hd ...

  10. POJ_3061_Subsequence_(尺取法)

    描述 http://poj.org/problem?id=3061 给定长度为n的数列整数以及整数S.求出总和不小于S的连续子序列的长度的最小值,如果解不存在输出0. Subsequence Time ...