caffee学习——图像切割
来源:互联网 发布:扑克游戏源码 编辑:程序博客网 时间:2024/06/05 22:54
参考使用https://github.com/dajunC/DSB3Tutorial
最近在使用caffee进行Deep learning的图像处理学习。学习过程中,需要对图片进行切割,用以消除不需要的训练杂质。通过查找大牛的方法,找到一个很好的方案。但大牛的方法是基于Tensorflow的,所以不能使用Keras库,但不影响图像切割的使用,只是需要一定的修改。
(1)对图像进行mask
from __future__ import print_function, divisionimport SimpleITK as sitkimport numpy as npimport osimport csvfrom glob import globimport pandas as pdtry: from tqdm import tqdm # 进度条插件except: print('TQDM does make much nicer wait bars...') tqdm = lambda x: xdef make_mask(center,diam,z,width,height,spacing,origin): '''Center : centers of circles px -- list of coordinates x,y,zdiam : diameters of circles px -- diameterwidthXheight : pixel dim of imagespacing = mm/px conversion rate np array x,y,zorigin = x,y,z mm np.arrayz = 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 NXNReturns 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 filesluna_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 filedef get_filename(file_list, case): for f in file_list: if case in f: return(f)## The locations of the nodesdf_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)
阅读全文
0 0
- caffee学习——图像切割
- caffee学习中文指南(1)(1)
- 图像处理 图像切割
- 学习opencv之(六)-图像切割,使用ROI
- 学习opencv之(六)-图像切割,使用ROI
- 学习opencv之(六)-图像切割,使用ROI
- android图像绘制(七)——ClipRect局部绘图,切割原图绘制
- 自动切割图像——负样本自动生成代码 C++
- 算法学习之——矩形切割思想
- 【算法学习】切割木棍问题——动态规划
- 图像切割上传SpringMVC
- WEB图像切割
- MATLAB 图像切割
- 图像切割,使用ROI
- 图像切割的方法
- openCV实现图像切割
- 图像变换--灰度切割、位图切割
- sstream——切割单词
- Java 加密 base64 encode
- linux之CRC校验
- UI基础控件
- C#中的变量类型var
- 微信发红包功能的实现
- caffee学习——图像切割
- java 文件上传时候报错 FileItemStream$ItemSkippedException
- svn:Checksum mismatch while updating
- recyclerview嵌套scrollview滑动卡顿的问题
- linux 下的mount
- 抓取URl数据方法
- Class中的cast方法(强制转换)
- awk用法
- How to Install Eclipse IDE with C/C++ and Qt V4.7.2 (OpenGL included)