MIND——Modality independent neighbourhood descriptor 模态无关邻域描述符

news/2024/4/20 20:34:57/文章来源:https://blog.csdn.net/qq_43608192/article/details/129023917

参考:

https://blog.mbedded.ninja/programming/signal-processing/image-processing/image-registration/modality-independent-neighbourhood-descriptor-mind/

《MIND: Modality independent neighbourhood descriptor for multi-modal deformable registration》论文

2D版的MIND_shchojj的博客-CSDN博客

MIND(模态独立邻域描述符)是一种图像配准算法,旨在提取每个像素/体素周围局部区域的结构信息。

一、原理介绍

1、公式介绍

MIND表达式如下:

Dp(I,x,x+r)指以x点为中心的Patch块和以x+r为中心的Patch块的距离,即两个Patch块之差的平方。

V(I,x)是指图像中x点的6邻域搜索空间内各点的Dp(I,x,x+r)相加再平均。(这个邻域搜索空间后面介绍)

MIND(I,x,r)是感兴趣点x的邻域搜索空间内这n个点的Dp(I,x,x+r)除以该点的V(I,x),再负对数。

邻域搜索空间neigh Search Space:分为三种

紧密型采样(全采样) 稀疏性采样(45°采样) 6邻域采样

*红色小块为感兴趣点,即需要求MIND特征的像素点。

如果设置一个5*5的一个neigh,紧密型采样的邻域搜索空间包括除红色像素以外的所有灰色像素点;稀疏型采样同理如中图所示;6邻域采样应该是文章针对三维图像来讲的,对于二维的图像,应该也可以说是4邻域。

Patch:3*3的patch是指一个3*3的像素小块

2、图示说明

从一个5*5的像素块开始理解:

*蓝色像素4的地方是感兴趣点,即正要计算MIND特征的像素点,

*靛青色像素是设置的4邻域搜索空间

开始计算之前,先设置参数patch(3*3),neigh(3*3,4邻域采样)

(1)4邻域搜索空间内各点的Dp(I,x,x+r)

向量x=(1,2),向量x+r={(1,1),(0,2),(1,3),(2,2)}

同理求完四个点的Dp(I,x,x+r)如下图所示:

(2)求V(I,x)

V(I,x)在2维图像中需要求4邻域搜索空间的4个点的Dp(I,x,x+r)的平均

到这里只求得了一个像素点(1,2)的V(I,x),对于整个5*5的像素块或者256*256的图像,我们就需要求出这个像素块或者图像的V(I,x)的一个矩阵。

array([[ 15.33,  41.97,  68.19,  87.61,  60.97],[ 47.06,  93.78, 126.25, 137.28,  90.56],[ 93.72, 141.75, 157.06, 129.78,  81.75],[109.42, 147.36, 152.08,  99.03,  61.08],[ 77.69,  95.56,  94.03,  49.36,  31.5 ]])

(3)计算MIND特征

那么MIND(I,(1,2))=[0.300,0.275,0.361,0.616]

同样到这里,我们只获得了点(1,2)的MIND特征,而对于这个5*5的像素块,我们还要获得其余24个点的MIND特征。

最终得到的这个5*5的像素块的MIND特征如下:

mind_descriptors =array([[[0.199, 0.404, 0.258, 0.884],[0.142, 0.554, 0.381, 0.611],[0.354, 0.301, 0.408, 0.421],[0.505, 0.446, 0.265, 0.307],[0.955, 0.374, 0.205, 0.25 ]],[[0.367, 0.615, 0.126, 0.643],[0.176, 0.604, 0.266, 0.649],[0.3  , 0.275, 0.361, 0.616],[0.395, 0.33 , 0.328, 0.428],[0.878, 0.244, 0.248, 0.344]],[[0.43 , 0.845, 0.142, 0.354],[0.301, 0.572, 0.255, 0.416],[0.326, 0.339, 0.377, 0.44 ],[0.419, 0.257, 0.552, 0.308],[0.765, 0.251, 0.445, 0.214]],[[0.49 , 0.887, 0.224, 0.188],[0.376, 0.589, 0.308, 0.269],[0.349, 0.388, 0.371, 0.365],[0.383, 0.199, 0.525, 0.46 ],[0.621, 0.211, 0.413, 0.339]],[[0.488, 0.948, 0.325, 0.121],[0.518, 0.558, 0.39 , 0.162],[0.432, 0.512, 0.412, 0.201],[0.575, 0.202, 0.575, 0.274],[0.528, 0.42 , 0.459, 0.18 ]]])

如果想要比较一个5*5和像素块A和一个5*5的像素块B的结构相似性,那么就要先获得A和B的形状为(5,5,4)的MIND特征矩阵。然后将每个像素点的对应的MIND矩阵加和作为该像素点的MIND特征,最后就又会得到A的5*5的MIND特征图和B的MIND特征图。论文中的MIND特征图展示如下:

二、Python实现代码Pytorch(2D版)

import torch
import numpy as np
import torchvision
import SimpleITK as sitk
import torch.nn.functional as F
import matplotlib.pyplot as plt
def gaussian_kernel(sigma, sz):xpos_vec = np.arange(sz)ypos_vec = np.arange(sz)output = np.ones([1, 1,sz, sz], dtype=np.single)midpos = sz // 2for xpos in xpos_vec:for ypos in ypos_vec:output[:,:,xpos,ypos] = np.exp(-((xpos-midpos)**2 + (ypos-midpos)**2) / (2 * sigma**2)) / (2 * np.pi * sigma**2)return output
def torch_image_translate(input_, tx, ty, interpolation='nearest'):# got these parameters from solving the equations for pixel translations# on https://www.tensorflow.org/api_docs/python/tf/contrib/image/transformtranslation_matrix = torch.zeros([1, 3, 3], dtype=torch.float)translation_matrix[:, 0, 0] = 1.0translation_matrix[:, 1, 1] = 1.0translation_matrix[:, 0, 2] = -2*tx/(input_.size()[2]-1)translation_matrix[:, 1, 2] = -2*ty/(input_.size()[3]-1)translation_matrix[:, 2, 2] = 1.0grid = F.affine_grid(translation_matrix[:, 0:2, :], input_.size()).to(input_.device)wrp = F.grid_sample(input_, grid, mode=interpolation)return wrp
def Dp(image, xshift, yshift, sigma, patch_size):shift_image = torch_image_translate(image, xshift, yshift, interpolation='nearest')#将image在x、y方向移动I`(a)diff = torch.sub(image, shift_image)#计算差分图I-I`(a)diff_square = torch.mul(diff, diff)#(I-I`(a))^2res = torch.conv2d(diff_square, weight =torch.from_numpy(gaussian_kernel(sigma, patch_size)), stride=1, padding=3)#C*(I-I`(a))^2return resdef MIND(image, patch_size, neigh_size, sigma, eps,image_size0,image_size1,  name='MIND'):# compute the Modality independent neighbourhood descriptor (MIND) of input image.# suppose the neighbor size is R, patch size is P.# input image is 384 x 256 x input_c_dim# output MIND is (384-P-R+2) x (256-P-R+2) x R*Rreduce_size = int((patch_size + neigh_size - 2) / 2)#卷积后减少的size# estimate the local variance of each pixel within the input image.Vimg = torch.add(Dp(image, -1, 0, sigma, patch_size), Dp(image, 1, 0, sigma, patch_size))Vimg = torch.add(Vimg, Dp(image, 0, -1, sigma, patch_size))Vimg = torch.add(Vimg, Dp(image, 0, 1, sigma, patch_size))#sum(Dp)Vimg = torch.div(Vimg,4) + torch.mul(torch.ones_like(Vimg), eps)#防除零# estimate the (R*R)-length MIND feature by shifting the input image by R*R times.xshift_vec = np.arange( -(neigh_size//2), neigh_size - (neigh_size//2))#邻域计算yshift_vec = np.arange(-(neigh_size // 2), neigh_size - (neigh_size // 2))#邻域计算iter_pos = 0for xshift in xshift_vec:for yshift in yshift_vec:if (xshift,yshift) == (0,0):continueMIND_tmp = torch.exp(torch.mul(torch.div(Dp(image, xshift, yshift,  sigma, patch_size), Vimg), -1))#exp(-D(I)/V(I))tmp = MIND_tmp[:, :, reduce_size:(image_size0 - reduce_size), reduce_size:(image_size1 - reduce_size)]if iter_pos == 0:output = tmpelse:output = torch.cat([output,tmp], 1)iter_pos = iter_pos + 1# normalization.input_max, input_indexes = torch.max(output, dim=1)output = torch.div(output,input_max)return output
def abs_criterion(in_, target):return torch.mean(torch.abs(in_ - target))
if __name__ == '__main__':patch_size=7neigh_size=9sigma=2.0eps=1e-5image_size0=512image_size1=512ct_path = r'F:\dataset\coarseReg\00001_SRO1_ct_axial_drr.nii.gz'mr_path = r'F:\dataset\coarseReg\00001_SRO1_mr_axial_drr.nii.gz'ct_sitk = sitk.ReadImage(ct_path,sitk.sitkFloat32)mr_sitk = sitk.ReadImage(mr_path,sitk.sitkFloat32)ct_axial_drr = sitk.GetArrayFromImage(ct_sitk)[np.newaxis ,np.newaxis,:,:]mr_axial_drr = sitk.GetArrayFromImage(mr_sitk)[np.newaxis ,np.newaxis,:,: ]plt.imshow(ct_axial_drr.squeeze())plt.show()ct_axial_drr = torch.from_numpy(ct_axial_drr)mr_axial_drr = torch.from_numpy(mr_axial_drr)A_MIND = MIND(ct_axial_drr,  patch_size, neigh_size, sigma, eps,image_size0,image_size1,  name='realA_MIND')B_MIND = MIND(mr_axial_drr,  patch_size, neigh_size, sigma, eps,image_size0,image_size1,  name='realA_MIND')g_loss_MIND = abs_criterion(A_MIND, B_MIND)print('g_loss_MIND', g_loss_MIND)# tf =  np.load( r"C:\Users\shcho\Desktop\validation\tf.npy" )# tc =  np.load( r"C:\Users\shcho\Desktop\validation\tc.npy" )# plt.imshow(tf)# plt.show()# plt.imshow(tc)# plt.show()# print(tf.shape, tc.shape)## # print(tf.transpose((2,0,1)).shape, tc.shape)# t = tf.transpose((2,0,1)) -tc## # t = tf -tc## print(np.max(t))

可以通过上面代码提取整张图像的MIND特征,且该函数可以被用于基于CycleGAN网络处理MRtoCT图像的损失函数并得到很好的结果,如论文《Unsupervised MR-to-CT Synthesis using Structure Constrained CycleGAN》所述,同理可用于相似的CycleGAN网络模型处理医学图像的任务中来约束A,B域的结构信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_73933.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch7.8.0版本进阶——文档分析 分析器

目录一、文档分析过程二、分析器三、内置分析器3.1、标准分析器3.2、简单分析器3.3、空格分析器3.4、语言分析器四、分析器使用场景五、分析器的测试示例一、文档分析过程 将一块文本分成适合于倒排索引的独立的词条。将这些词条统一化为标准格式以提高它们的“可搜索性”&…

JDBC-

文章目录JDBC1,JDBC概述1.1 JDBC概念1.2 JDBC本质1.3 JDBC好处2,JDBC快速入门2.1 编写代码步骤2.2 具体操作3,JDBC API详解3.1 DriverManager3.2 Connection (事务归我管)3.2.1 获取执行对象3.2.2 事务管理3.3 Stateme…

12.STM32系统定时器-SysTick

目录 1.系统定时器-SysTick 2.SysTick定时时间的计算 3.SysTick结构体 4.SysTick固件库函数 5.SysTick中断优先级 1.系统定时器-SysTick SysTick:24位系统定时器,只能递减,存在于内核嵌套在NVIC中。所有的Cortex-M中都有这个系统定时器。 重装载值…

interrupt多线程设计模式

1. 两阶段终止-interrupt Two Phase Termination 在一个线程T1中如何“优雅”终止线程T2?这里的【优雅】指的是给T2一个料理后事的机会。 错误思路 ● 使用线程对象的stop()方法停止线程(强制杀死) —— stop()方法…

会声会影2023电脑版下载及系统配置要求

平时大家可能会经常听到有人说会声会影,但是很多人都不知道这是什么软件。其实听它的名字就知道这是一款和声音、影像有关系的软件。下面,小编就来给大家具体介绍一下这款软件吧。 会声会影是一套操作简单的DV、HDV影片剪辑软件。会声会影不仅完全符合家…

农业科技发展所带来的好处:提高农作物产量,提高农民收入

农业科技发展所带来的好处::(1)育种技术:通过育种技术,科学家可以在农作物基因中挑选和改变一些特定的性状,例如增加产量、改善耐旱性和抗病性等等,从而提高农作物产量。&#xff08…

el-cascader 级联选择器懒加载的使用及回显 + 点击任意一级都能返回

需要实现的需求 数据渲染使用懒加载点击任意一级都可返回&#xff0c;不需要一直点到最后一级编辑或者查看功能&#xff0c;回显之前选择的数据 实例解析 dom 元素 <el-cascaderv-model"value":options"options":props"props":key"n…

Linux内核段页式内存管理技术

一、概述 1.虚拟地址空间 内存是通过指针寻址的&#xff0c;因而CPU的字长决定了CPU所能管理的地址空间的大小&#xff0c;该地址空间就被称为虚拟地址空间&#xff0c;因此32位CPU的虚拟地址空间大小为4G&#xff0c;这和实际的物理内存数量无关。 Linux内核将虚拟地址空间分…

五种IO模型以及select多路转接IO模型

目录 一、典型IO模型 1.1 阻塞IO 1.2 非阻塞IO 1.3 信号驱动I0 1.4 IO多路转接 1.5 异步IO 多路转接的作用和意义 二、多路转接IO模型&#xff08;select&#xff09; 2.1 接口 2.2 接口当中的事件集合&#xff1a; fd_set 2.2 select使用事件集合&#xff08;位图&am…

174万亿采购,奔向数字化

采购不单纯发生在外部&#xff0c;更发生在内部&#xff0c;只有两者同时进行&#xff0c;才能完成采购中心从成本到利润中心角色的转变。 作者|斗斗 编辑|皮爷 出品|产业家 数字化&#xff0c;让很多企业业务流程发生了质变。 《2022数字化采购发展报告》显示&#x…

破解票房之谜:为何高票房电影绕不过“猫眼们”?

如此火爆的春节档很多&#xff0c;如此毁誉参半的春节档鲜有。2023开年&#xff0c;集齐张艺谋、沈腾的《满江红》&#xff0c;以及有票房前作打底的《流浪地球2》接连两部春节档电影票房进入前十&#xff0c;为有些颓靡的中国电影市场注入了一针“强心剂”。与票房同样热闹起来…

无重叠区间-力扣435-java贪心策略

一、题目描述给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠 。示例 1:输入: intervals [[1,2],[2,3],[3,4],[1,3]]输出: 1解释: 移除 [1,3] 后&#xff0c;剩下的区间没有重叠。…

【爬虫】2.2 BeautifulSoup 装载HTML文档

HTML文档结点的查找工具很多&#xff0c;其中 BeautifulSoup 是功能强大且十分流行的查找工具之一。1. BeautifulSoup 的安装安装&#xff1a;pip install bs4导包&#xff1a;from bs4 import BeautifulSoup2. BeautifulSoup 装载HTML文档如果 doc 是一个 HTML 文档&#xff0…

深度学习训练营之yolov5 官方代码调用以及-requirements.txt下载当中遇到的问题

深度学习训练营之yolov5 官方代码调用原文链接内容总结环境介绍前置工作简单介绍yolov5下载源码yolov5的下载遇到问题问题解析问题处理创建虚拟环境下载当中遇到的问题代码运行视频检测参考内容原文链接 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客…

gazebo仿真环境中添加robotiq 2f 140的gripper_controller控制器

gazebo仿真环境中添加robotiq 2f 140的gripper_controller控制器 搭建环境&#xff1a; ubuntu: 20.04 ros: Nonetic sensor: robotiq_ft300 gripper: robotiq_2f_140_gripper UR: UR3 reasense&#xff1a; D435i 通过下面几篇博客配置好了ur3、力传感器、robotiq夹爪、rea…

18523-47-2,3-Azidopropionic Acid,叠氮基丙酸,可以与炔烃发生点击化学反应

【中文名称】3-叠氮基丙酸【英文名称】 3-Azidopropionic Acid&#xff0c;3-Azidopropionic COOH【结 构 式】【CAS】18523-47-2【分子式】C3H5N3O2【分子量】115.09【纯度标准】95%【包装规格】1g&#xff0c;5g&#xff0c;10g【是否接受定制】可进行定制&#xff0c;定制时…

java原理4:java的io网络模型

文章目录1&#xff1a;基础概念1&#xff1a;同步和异步2&#xff1a;阻塞和非阻塞2.1&#xff1a;阻塞IO2.2&#xff1a;非阻塞io2.3&#xff1a;io复用3&#xff1a;同步/异步和阻塞/非阻塞3.1&#xff1a;同步非阻塞NIO4: redis为什么速度快Java 网络IO模型简介1&#xff1a…

Tapdata 和 Databend 数仓数据同步实战

作者&#xff1a;韩山杰https://github.com/hantmacDatabend Cloud 研发工程师基础架构在云计算时代也发生着翻天地覆的变化&#xff0c;对于业务的支持变成了如何能利用好云资源实现降本增效&#xff0c;同时更好的支撑业务也成为新时代技术人员的挑战。 本篇文章通过&#xf…

删除MySQL表中的重复数据?

前言 一般我们将数据存储在MySQL数据库中&#xff0c;它允许我们存储重复的数据。但是往往重复的数据是作废的、没有用的数据&#xff0c;那么通常我们会使用数据库的唯一索引 unique 键作为限制。问题来了啊&#xff0c;我还没有创建唯一索引捏&#xff0c;数据就重复了&…

jianzhiOffer第二版难重点记录

04. 二维数组中的查找https://leetcode.cn/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/ 思路&#xff1a;可以每层用以恶搞二分查找&#xff0c;优化思路&#xff1a;从左下角出发直接用二分。 ​​​​​​07. 重建二叉树https://leetcode.cn/problems/zhong-jian-er-cha…