caffee学习——图像切割

caffee学习——图像切割caffee 学习

参考使用https://github.com/dajunC/DSB3Tutorial

最近在使用caffee进行Deep learning的图像处理学习。学习过程中,需要对图片进行切割,用以消除不需要的训练杂质。通过查找大牛的方法,找到一个很好的方案。但大牛的方法是基于Tensorflow的,所以不能使用Keras库,但不影响图像切割的使用,只是需要一定的修改。

(1)对图像进行mask

from __future__ import print_function, division import SimpleITK as sitk import numpy as np import os import csv from glob import glob import pandas as pd try: from tqdm import tqdm # 进度条插件 except: print('TQDM does make much nicer wait bars...') tqdm = lambda x: x def make_mask(center,diam,z,width,height,spacing,origin): ''' Center : centers of circles px -- list of coordinates x,y,z diam : diameters of circles px -- diameter widthXheight : pixel dim of image spacing = mm/px conversion rate np array x,y,z origin = x,y,z mm np.array z = z position of slice in world coordinates mm ''' mask = np.zeros([height,width]) # 0's everywhere except nodule swapping x,y to match img #convert to nodule space from world coordinates # Defining the voxel range in which the nodule falls v_center = (center-origin)/spacing v_diam = int(diam/spacing[0]+5) v_xmin = np.max([0,int(v_center[0]-v_diam)-5]) v_xmax = np.min([width-1,int(v_center[0]+v_diam)+5]) v_ymin = np.max([0,int(v_center[1]-v_diam)-5]) v_ymax = np.min([height-1,int(v_center[1]+v_diam)+5]) v_xrange = range(v_xmin,v_xmax+1) v_yrange = range(v_ymin,v_ymax+1) # Convert back to world coordinates for distance calculation x_data = [x*spacing[0]+origin[0] for x in range(width)] y_data = [x*spacing[1]+origin[1] for x in range(height)] # Fill in 1 within sphere around nodule for v_x in v_xrange: for v_y in v_yrange: p_x = spacing[0]*v_x + origin[0] p_y = spacing[1]*v_y + origin[1] if np.linalg.norm(center-np.array([p_x,p_y,z]))<=diam: mask[int((p_y-origin[1])/spacing[1]),int((p_x-origin[0])/spacing[0])] = 1.0 return(mask) def matrix2int16(matrix): ''' matrix must be a numpy array NXN Returns uint16 version ''' m_min= np.min(matrix) m_max= np.max(matrix) matrix = matrix-m_min return(np.array(np.rint( (matrix-m_min)/float(m_max-m_min) * 65535.0),dtype=np.uint16))  # # Getting list of image files luna_path = "F:/test/" luna_subset_path = luna_path+"dataset/" output_path = "F:/test/output/" file_list=glob(luna_subset_path+"*.mhd")  # # Helper function to get rows in data frame associated  # with each file def get_filename(file_list, case): for f in file_list: if case in f: return(f) # # The locations of the nodes df_node = pd.read_csv(luna_path+"test.csv") df_node["file"] = df_node["seriesuid"].map(lambda file_name: get_filename(file_list, file_name)) df_node = df_node.dropna()  # # Looping over the image files # for fcount, img_file in enumerate(tqdm(file_list)): mini_df = df_node[df_node["file"]==img_file] #get all nodules associate with file if mini_df.shape[0]>0: # some files may not have a nodule--skipping those  # load the data once itk_img = sitk.ReadImage(img_file) img_array = sitk.GetArrayFromImage(itk_img) # indexes are z,y,x (notice the ordering) num_z, height, width = img_array.shape #heightXwidth constitute the transverse plane origin = np.array(itk_img.GetOrigin()) # x,y,z Origin in world coordinates (mm) spacing = np.array(itk_img.GetSpacing()) # spacing of voxels in world coor. (mm) # go through all nodes (why just the biggest?) for node_idx, cur_row in mini_df.iterrows(): node_x = cur_row["coordX"] node_y = cur_row["coordY"] node_z = cur_row["coordZ"] diam = cur_row["diameter_mm"] # just keep 3 slices imgs = np.ndarray([3,height,width],dtype=np.float32) masks = np.ndarray([3,height,width],dtype=np.uint8) center = np.array([node_x, node_y, node_z]) # nodule center v_center = np.rint((center-origin)/spacing) # nodule center in voxel space (still x,y,z ordering) for i, i_z in enumerate(np.arange(int(v_center[2])-1, int(v_center[2])+2).clip(0, num_z-1)): # clip prevents going out of bounds in Z mask = make_mask(center, diam, i_z*spacing[2]+origin[2], width, height, spacing, origin) masks[i] = mask imgs[i] = img_array[i_z] np.save(os.path.join(output_path,"images_%04d_%04d.npy" % (fcount, node` idx)),imgs) np.save(os.path.join(output_path,"masks_%04d_%04d.npy" % (fcount, node_idx)),masks) 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/205481.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午5:55
下一篇 2026年3月19日 下午5:56


相关推荐

  • linux load average,Linux 平均负载 Load Average 详解[通俗易懂]

    linux load average,Linux 平均负载 Load Average 详解[通俗易懂]一、什么是LoadAverage?系统负载(SystemLoad)是系统CPU繁忙程度的度量,即有多少进程在等待被CPU调度(进程等待队列的长度)。平均负载(LoadAverage)是一段时间内系统的平均负载,这个一段时间一般取1分钟、5分钟、15分钟。二、如何查看LoadAverage?top命令,w命令,uptime等命令都可以查看系统负载;三、LoadAverage的3个数值各是什…

    2022年7月17日
    19
  • pycharm连接服务器并debug

    pycharm连接服务器并debugpycharmdebug 加参数如图所示 点击 Run gt EditConfigur 在 Configuratio 处的 parameters 将想传入的参数写入 我直接把 args 文件复制了 之后点击 ok 即可 期间遇到的一些问题 Q 点击 debug 后 模型一直处在 collectingda 显示不出来 Variables 解决办法 在 File gt Settings gt PythonDebugg 勾选 Geventcompat 即可

    2026年3月17日
    2
  • java中scanner的作用_Java中的Scanner类有什么作用[通俗易懂]

    java中scanner的作用_Java中的Scanner类有什么作用[通俗易懂]介绍:简单来说,Scanner就是用来获取用户在控制台输入的字符串,也可以获取一个文件中的字符串。java.util.Scanner是Java5的特征,一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器。使用方法介绍:1、使用不同的next方法将得到的标记转换为不同类型的值,比如说要从获控制台取一个输入字符串中的int类型的数字,使用nextInt。代码示例:Scanners…

    2022年7月20日
    16
  • navcat 激活码(JetBrains全家桶)

    (navcat 激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlMLZPB5EL5Q-eyJsaWNlbnNlSW…

    2022年3月20日
    61
  • pytest fixtures_pytest allure

    pytest fixtures_pytest allurefixture的优势Pytest的fixture相对于传统的xUnit的setup/teardown函数做了显著的改进:命名方式灵活,不局限于setup和teardown这几个命名conf

    2022年7月30日
    6
  • OpenClaw 全新搭档:英特尔芯铭凡 M2 Pro 重塑隐私与实用平衡

    OpenClaw 全新搭档:英特尔芯铭凡 M2 Pro 重塑隐私与实用平衡

    2026年3月13日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号