当前位置: 首页 > 编程日记 > 正文

医疗影像处理:去除医疗影像中背景的影响2D/3D【numpy-code】| CSDN博文精选

640?wx_fmt=jpeg

BDTC大会官网:https://t.csdnimg.cn/q4TY


作者 | chestnut--
来源 | CSDN博客


在医疗影像中特别是CT影像,包含大量的背景,在进行器官分割时,首先去除背景对分割的效果有很好的提升。本博客使用Python处理医疗影像并去除背景的影像。


使用的样例数据来自Multimodal Brain Tumor Segmentation Challenge 2018(https://www.med.upenn.edu/sbia/brats2018/registration.html)


读取数据的基本信息


import nibabel as nib
import numpy as np
from nilearn.image.image import _crop_img_to as crop_img_to
file = 'flair.nii.gz'
image = nib.load(file)
print(image.shape)


(240, 240, 155)


print(np.max(image.get_data()),np.min(image.get_data()))


470, 0


注意:0为背景像素值


显示其中的一个slice


import matplotlib.pyplot as plt
data = image.get_data()[:,:,52]
plt.imshow(data)


640?wx_fmt=jpeg

得到裁剪的空间位置坐标


def get_slice_index(data, rtol=1e-8):

    infinity_norm = max(-data.min(), data.max())
    passes_threshold = np.logical_or(data < -rtol * infinity_norm,
                                     data > rtol * infinity_norm)  ##
    if data.ndim == 4:
        passes_threshold = np.any(passes_threshold, axis=-1)

    coords = np.array(np.where(passes_threshold))
    start = coords.min(axis=1)
    end = coords.max(axis=1) + 1

    # pad with one voxel to avoid resampling problems
    start = np.maximum(start - 10)
    end = np.minimum(end + 1, data.shape[:3])

    slices = [slice(s, e) for s, e in zip(start, end)]
    return slices


使用True 和False标记背景区域,背景像素值为False。


def have_back(image):
    background_value=0
    tolerance=0.00001
    is_foreground = np.logical_or(image.get_data() < (background_value - tolerance),
                                  image.get_data()> (background_value + tolerance))
    foreground = np.zeros(is_foreground.shape, dtype=np.uint8)
    foreground[is_foreground] = 1
    return foreground


调用,得到背景图标记,通过背景图标记得到坐标位置


foreground = have_back(image)
crop = get_slice_index(foreground)
print(crop)


[slice(45, 192, None), slice(47, 210, None), slice(0, 137, None)]

分别代表X,Y,Z的裁剪坐标


裁剪


image_o = crop_img_to(image, crop, copy=True)


image_o shape (147, 163, 137)


显示裁剪之后的结果


import matplotlib.pyplot as plt
data_o = image_o.get_data()[:,:,52]
plt.imshow(data_o)


对比着看一下:


640?wx_fmt=jpeg

640?wx_fmt=jpeg


以上参考的是[1]中的代码。


[2]中相同的处理方式,同时能够处理2D和3D。


整体的代码如下,主要使用到了get_none_zero_region和crop_ND_volume_with_bounding_box这两个函数:


def get_none_zero_region(im, margin):
    """
    get the bounding box of the non-zero region of an ND volume
    """

    input_shape = im.shape
    if(type(margin) is int ):
        margin = [margin]*len(input_shape)
    assert(len(input_shape) == len(margin))
    indxes = np.nonzero(im)
    idx_min = []
    idx_max = []
    for i in range(len(input_shape)):
        idx_min.append(indxes[i].min())
        idx_max.append(indxes[i].max())

    for i in range(len(input_shape)):
        idx_min[i] = max(idx_min[i] - margin[i], 0)
        idx_max[i] = min(idx_max[i] + margin[i], input_shape[i] - 1)
    return idx_min, idx_max

def crop_ND_volume_with_bounding_box(volume, min_idx, max_idx):
    """
    crop/extract a subregion form an nd image.
    """

    dim = len(volume.shape)
    assert(dim >= 2 and dim <= 5)
    if(dim == 2):
        output = volume[np.ix_(range(min_idx[0], max_idx[0] + 1),
                               range(min_idx[1], max_idx[1] + 1))]
    elif(dim == 3):
        output = volume[np.ix_(range(min_idx[0], max_idx[0] + 1),
                               range(min_idx[1], max_idx[1] + 1),
                               range(min_idx[2], max_idx[2] + 1))]
    elif(dim == 4):
        output = volume[np.ix_(range(min_idx[0], max_idx[0] + 1),
                               range(min_idx[1], max_idx[1] + 1),
                               range(min_idx[2], max_idx[2] + 1),
                               range(min_idx[3], max_idx[3] + 1))]
    elif(dim == 5):
        output = volume[np.ix_(range(min_idx[0], max_idx[0] + 1),
                               range(min_idx[1], max_idx[1] + 1),
                               range(min_idx[2], max_idx[2] + 1),
                               range(min_idx[3], max_idx[3] + 1),
                               range(min_idx[4], max_idx[4] + 1))]
    else:
        raise ValueError("the dimension number shoud be 2 to 5")
    return output


使用:


margin = 5 
bbmin, bbmax = get_none_zero_region(arr, margin)
bbmin, bbmax


([34, 17], [171, 191])


arr为2D或者3D的矩阵。


volume = crop_ND_volume_with_bounding_box(arr, bbmin, bbmax)


640?wx_fmt=png

参考

3DUnetCNN

https://github.com/ellisdg/3DUnetCNN

3DUnet-Tensorflow-Brats18

https://github.com/tkuanlun350/3DUnet-Tensorflow-Brats18/blob/master/utils.py


扫码查看原文
▼▼▼

640?wx_fmt=jpeg


(*本文为AI科技大本营转载文章,转载联系原作者)



精彩推荐



2019 中国大数据技术大会(BDTC)再度来袭!豪华主席阵容及百位技术专家齐聚,15 场精选专题技术和行业论坛,超强干货+技术剖析+行业实践立体解读,深入解析热门技术在行业中的实践落地。6.6 折票限时特惠(立减1400元),学生票仅 599 元!


640?wx_fmt=jpeg
推荐阅读

相关文章:

iOS APP提交上架最新流程

iOS APP提交上架最新流程 反复提交的过程中对上架流程熟悉了好多&#xff0c;写篇帖子送给同为菜鸟的你&#xff0c;如果里面有很菜的东西&#xff0c;大牛请自动忽略&#xff0c;毕竟这也是还为菜鸟的我的备忘录呢&#xff01; 首先得描述一下各个证书的定位&#xff0c;作…

Spring mvc Data Redis—Pub/Sub(附Web项目源码)

一、发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候&#xff0c;我们称这个客户端为发布者(publisher)。 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE 命令接收信息的时候&#xff0c;我们称这个客户端为订阅者(subscriber)。 为了解耦发布者(publish…

iOS分析崩溃日志

前言 iOS分析定位崩溃问题有很多种方式&#xff0c;但是发布到AppStore的应用如果崩溃了&#xff0c;我们该怎么办呢&#xff1f;通常我们都会在系统中接入统计系统&#xff0c;在系统崩溃的时候记录下崩溃日志&#xff0c;下次启动时将日志发送到服务端&#xff0c;比较好的第…

海思3559A上编译FFmpeg源码操作步骤

1. 从https://github.com/FFmpeg/FFmpeg/releases 下载你需要的版本&#xff1b; 2. 因为ffmpeg编译选项较多&#xff0c;为了更方便的了解有哪些选项&#xff0c;可将编译选项写入到一个文本文件configure_help.txt中&#xff0c;执行&#xff1a; ./configure --help > …

不到顶会现场也能听论文讲解?这个视频集合网站值得收藏

BDTC大会官网&#xff1a;https://t.csdnimg.cn/q4TY作者 | 刘畅出品 | AI科技大本营&#xff08;ID:rgznai1000&#xff09;最近跟身边的硕士生、博士生聊天&#xff0c;发现有一个共同话题&#xff0c;大家都想要知道哪款产品能防止掉头发&#xff1f;养发育发已经成了茶余饭…

通过cat /proc/cpuinfo看处理器特点

2019独角兽企业重金招聘Python工程师标准>>> 在我的服务器上执行cat /proc/cpuinfo得到如下信息&#xff08;摘录最后一项&#xff0c;从0-23共24项&#xff09;&#xff1a; processor: 23&#xff1a;超线程技术的虚拟逻辑核第24个 vendor_id: GenuineIntel&#…

2016cocoapods安装流程及使用

一&#xff1a;参考安装流程&#xff1a;http://blog.csdn.NET/showhilllee/article/details/38398119/。 二&#xff1a;我的安装步骤。 1:安装cocoapods需要ruby&#xff0c;先查看ruby环境是不是最新版本。如果不是最新版本&#xff0c;需要先升级到最新版本。在终端输入以下…

FFmpeg中拉取rtsp视频流并缩放显示测试代码

之前在https://blog.csdn.net/fengbingchun/article/details/92198857中给出过仅拉取rtsp视频流的测试代码&#xff0c;这里在此代码的基础上进行扩充&#xff0c;包括设置使用多线程进行解码&#xff0c;使用sws_scale函数进行图像格式转换和缩放&#xff0c;并通过OpenCV进行…

全面分析阿里数据中台,小白也能看懂 | CSDN原力计划

扫码参与CSDN“原力计划”作者 | yuanziok来源 | CSDN原力计划获奖作品数据中台被誉为大数据的下一站&#xff0c;由阿里兴起&#xff0c;核心思想是数据共享&#xff0c;2015年阿里提出“大中台&#xff0c;小前台”的策略。2018 年因为“腾讯数据中台论”&#xff0c;中台再度…

【Stage3D学习笔记续】山寨Starling(八):核心优化(批处理)的实现

批处理是使GPU进行高效绘制的一种技术手段&#xff0c;也是整个渲染流程中最核心的技术&#xff0c;到目前为止我们并没有使用到这种技术手段&#xff0c;下面我们看看我们现在的渲染机制。 先想一想我们最开始是怎么向GPU绘制一幅图像的&#xff0c;可以回头查看Stage3D学习笔…

MBProgressHUD 使用详解

MBProgressHUD是一个显示HUD窗口的第三方类库&#xff0c;用于在执行一些后台任务时&#xff0c;在程序中显示一个表示进度的loading视图和两个可选的文本提示的HUD窗口。我想最多是应用在加载网络数据的时候。其实苹果官方自己有一个带有此功能的类UIProgressHUD&#xff0c;只…

V4L2获取usb视频流测试代码

Video4Linux2(Video for Linux Two, 简称V4L2)是Linux中关于视频设备的驱动框架&#xff0c;为上层访问底层的视频设备提供统一接口。V4L2主要支持三类设备&#xff1a;视频输入输出设备、VBI设备和Radio设备&#xff0c;分别会在/dev目录下产生videoX、vbiX和radioX设备节点&a…

深度学习渐趋冷静,为何图形计算却逆势反涨?

不知不觉&#xff0c;2019 年的进度条已经快撑不住了 ▓▓▓▓▓▓▓▓▓▓▓▓▓░░ 88%。就像这个进度条一样&#xff0c;人工智能的发展也绝不是一蹴而就的事&#xff0c;而是一步一个脚印逐渐发展&#xff0c;最后达成某个目标。近年来&#xff0c;深度学习领域的技术发展…

数字图像处理课设

2019独角兽企业重金招聘Python工程师标准>>> 对于整个窗体的设计&#xff0c;菜单组件&#xff08;MenuStrip)和工具条&#xff08;ToolStrip&#xff09;来添加相应的功能事件当然还有右击鼠标就能弹出相应的属性框&#xff0c;也是使用了叫contextMenuStrip的组件…

Swift3.0带来的变化汇总

var string "Hello-Swift" //获取某个下标后一个下标对应的字符 char"e" //swift2.2 //var char string[startIndex.successor()] //swift3.0 var char string[string.index(after: startIndex)] //获取某个下标前一个下标对应的字符 char2 "t&qu…

通过配置NFS使Ubuntu和海思3559A板子共享目录

之前在Ubuntu和海思3559A板子之间来回拷贝文件都是用的scp命令&#xff0c;不是很方便&#xff0c;这里通过配置NFS来实现它们之间共享目录&#xff0c;操作步骤如下&#xff1a; 1. 在Ubuntu上安装NFS&#xff0c;执行以下命令&#xff0c;执行结果如下&#xff1a; sudo ap…

22w+的人选择了这款蓝牙耳机

01现在有两个电子产品&#xff0c;应该是你们现在必有的&#xff0c;手机和电脑。但还有一样不可缺少的电子产品&#xff0c;那就是耳机。不管喜不喜欢带&#xff0c;反正你手里肯定有一个&#xff0c;应该没人不认可我说的这个话吧。反正我去哪都会带着耳机&#xff0c;听不听…

自定义数字格式字符串输出示例

自定义数字格式字符串输出示例 MSDN 下表阐释了通过给特定数据类型和值应用某些自定义数字格式字符串来创建的输出。输出是通过使用 ToString 方法和美国英语 (en-US) 区域性生成的。 “格式字符串”列指示格式字符串&#xff0c;“数据类型”列指示所用的数据类型&#xff0c;…

海思3559A上编译LIVE555源码操作步骤

1. 从http://www.live555.com/liveMedia/public/ 下载live.2019.06.28.tar.gz&#xff0c;并解压缩&#xff1b; 2. 生成静态库&#xff0c;拷贝一份config.armlinux&#xff0c;取名为config.hi3559a&#xff0c;修改后的内容如下: CROSS_COMPILE? /opt/hisi-linux/x86-ar…

基于海康机器视觉算法平台的对位贴合项目个人理解 | CSDN原力计划

扫码参与CSDN“原力计划”作者 | 果汁分你一半哈哈来源 | CSDN原力计划获奖作品都说“纸上得来终觉浅&#xff0c;绝知此事要躬行”&#xff0c;可惜咱没这条件呀&#xff0c;没项目咱也不能干坐着呀&#xff0c;那咱发挥主观能动性&#xff0c;咱不是学机械的么&#xff0c;还…

解决Swift中present(uiImagePickerController,animated: true,completion: nil)闪退的问题

swift中开发选择图片上传&#xff0c;会使用到Tap Gesture Recognizer控件&#xff0c;对应 UITapGestureRecognizer API&#xff0c;以下是代码示例&#xff08;取自IOS developer library&#xff09;&#xff1a; IBAction func selectImageFromPhotoLibrary(_ sender: UIT…

测试发现equals和hashCode与书上描述的不一样

2019独角兽企业重金招聘Python工程师标准>>> 如果两个对象根据equals()方法比较是相等的&#xff0c;那么调用这两个对象中任意一个对象的hashCode方法都必须产生同样的整数结果。但是现实情况&#xff0c;两者产生的hashCode值却不相等求解&#xff1f; 转载于:htt…

海思3559A上编译OpenCV4.1.0源码操作步骤

1. 从https://github.com/opencv/opencv/releases 下载opencv源码opencv-4.1.0.zip并解压缩&#xff1b; 2. 修改最顶层的CMakeLists.txt&#xff0c;在第658行加入一条语句如下&#xff0c;fix error: pngstruct.h:30:18: fatal error: zlib.h: No such file or directory #i…

如何从零开始设计与开发一款通用模型预测调度系统 | 干货分享

机器学习模型从训练导出到生成环境部署&#xff0c;这个过程中涉及大量工作&#xff0c;会面临着各种问题与挑战&#xff0c;比如不断丰富的业务场景&#xff0c;系统需要负载种类繁多的神经网络&#xff0c;预测任务不均匀等&#xff0c;然而企业拥有的计算资源&#xff08;如…

闲来无事,总结 Xcode常用快捷键

IOS模拟器home键&#xff1a;Command Shift H 构建应用程序&#xff1a;Command &#xff0b; B 运行app&#xff1a;Command &#xff0b; R 清理工程&#xff1a;Command &#xff0b; Shift &#xff0b; K 打开Xcode首选项&#xff1a;Command &#xff0b; &#xff…

openNebulafrontEnd ComputeNode 配置记录

openNebulafrontEnd ComputeNode 配置记录 1,OpenNebula nfs(file system shared) for image datastore; openNebula computeNode挂载,如果frontend与compute在同一台服务器则不用做NFS shared; 3,make raw image 4,配置过程中配置服务器网桥报错 报错信息 bringing up interfa…

武汉大学提出ARGAN:注意力循环生成对抗模型用于检测、去除图像阴影 | ICCV 2019...

作者 | 王红成出品&#xff5c;AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】如何去除一张图像中的阴影部分&#xff1f;在ICCV 2019会上&#xff0c;武汉大学的一篇论文针对这一问题提出了一种用于阴影检测和去除的注意循环生成对抗网络——ARGAN。论…

海思3559A上编译libyuv源码操作步骤

1. 下载libyuv源代码&#xff0c;执行&#xff1a; git clone https://chromium.googlesource.com/libyuv/libyuv 2. 通过CMakeLists.txt编译生成库&#xff0c;build.sh脚本内容如下&#xff1a; cmake \-DCMAKE_BUILD_TYPERELEASE \-DCMAKE_C_COMPILER/opt/hisi-linux/x86…

Cocoapods的安装以及使用(2)

Cocoapods 在网上看博客&#xff0c;看了好多次&#xff0c;都没有学会cocoapods&#xff0c;今天上午浪费了一上午的时间&#xff0c;终于算是学会了。其实也是很简单的。 iOS 新版 CocoaPods 安装流程 1.换掉现有Ruby默认源&#xff08;由于好多人都没有翻墙&#xff0c;所…

MyEclipse10中导入的jquery文件报错(出现红叉叉,提示语法错误)

为了做一个页面特效&#xff0c;导入了一个jquery文件&#xff0c;怎想&#xff0c;myeclipse竟然报错说是语法错误&#xff0c;但是这个js文件我是从官网上下载的&#xff0c;不应该出错才对&#xff0c;百度谷歌之后终于找到了解决办法&#xff1a; 选中报错的js文件&#xf…