图像预处理

首先吧nii格式转png,取出单张切片实验,把图像灰度值转到0-255.

import os
import cv2
from medpy.io import load,save
import numpy as npdef label_seg(nii_path, save_folder):data_nii_path = nii_path + '\File3'        # 存放原始CT数据file_list = os.listdir(data_nii_path)      # 批量处理for nii_data in file_list:data, header = load(os.path.join(data_nii_path, nii_data))   # 加载nii文件img, header1 = load(os.path.join(data_nii_path, nii_data.replace('segmentation', 'volume')))# str.replace(old,new)用new替换old(字符串)# 加窗处理,过滤掉过于的组织img[img > 250] = 250img[img < -250] = -250stomach = np.zeros(data.shape)         # 创建一个全为0的矩阵,形状与加载的nii文件大小一样img_name = os.path.split(nii_data)     # 分离文件名,用以保存时的文件名前缀'''split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串str.split(str="", num=string.count(str)). str -- 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。num -- 分割次数。默认为 -1, 即分隔所有。'''img_name = img_name[-1]img_name = img_name.split('.')img_name = img_name[0]for i in range(0, slice_num):# 标签 + CT原图(只取有标签的,存放在同一个文件夹下)if stomach[:, :, i].max() > 0:  # 胃壁stomach_label = stomach[:, :, i] * 255stomach_img = (img[:, :, i] - img[:, :, i].min()) / (img[:, :, i].max() - img[:, :, i].min()) * 255print(cv2.imwrite("%s/%s-%d.png" % (stomach_label_path, "stomach-" + img_name, i), stomach_label))print(cv2.imwrite("%s/%s-%d.png" % (stomach_label_path, "stomach-" + img_name.replace('segmentation', 'volume'), i), stomach_img))img_data = (img[:, :, i] - img[:, :, i].min()) / (img[:, :, i].max() - img[:, :, i].min()) * 255print(cv2.imwrite("%s/%s-%d.png" % (data_nii_path, img_name.replace('segmentation', 'volume'), i), img_data))if __name__ == "__main__":nii_path = r'D:\Desktop\seg'# save_path = r'/media/image522/数据/stomach/png'save_path = r'D:\Desktop\seg\image\image2'label_seg(nii_path, save_path)

RSF算法

#coding:utf-8
import sys
import numpy as np
import cv2
import matplotlib.pyplot as plt
import math
from PIL import Imagedef DrawContour(LSF,p1,p2):# print(LSF.shape)plt.clf();plt.imshow(Image),plt.xticks([]), plt.yticks([]);plt.contour(LSF,[0],color = p1,linewidth = p2);plt.show(block=False),plt.pause(0.01);def mat_math (intput,str):output=intput;for i in range(img.shape[0]):for j in range(img.shape[1]):if str=="atan":output[i,j] = math.atan(intput[i,j]);if str=="sqrt":output[i,j] = math.sqrt(intput[i,j]);# print(output.shape)return output;def RSF (LSF, img, mu, nu, epison,step,lambda1,lambda2,kernel):Drc = (epison / math.pi) / (epison*epison+ LSF*LSF);Hea = 0.5*(1 + (2 / math.pi)*mat_math(LSF/epison,"atan"));Iy, Ix = np.gradient(LSF);s = mat_math(Ix*Ix+Iy*Iy,"sqrt");Nx = Ix / (s+0.000001);Ny = Iy / (s+0.000001);Mxx,Nxx =np.gradient(Nx);Nyy,Myy =np.gradient(Ny);cur = Nxx + Nyy;Length = nu*Drc*cur;Lap = cv2.Laplacian(LSF,-1);# print(Lap.shape)Penalty = mu*(Lap - cur);KIH = cv2.filter2D(Hea*img,-1,kernel);KH = cv2.filter2D(Hea,-1,kernel);f1 = KIH / KH; KIH1 = cv2.filter2D((1-Hea)*img,-1,kernel);KH1 = cv2.filter2D(1-Hea,-1,kernel);f2 = KIH1 / KH1; R1 = (lambda1- lambda2)*img*img;R2 = cv2.filter2D(lambda1*f1 - lambda2*f2,-1,kernel);R3 = cv2.filter2D(lambda1*f1*f1 - lambda2*f2*f2,-1,kernel);RSFterm = -Drc*(R1-2*R2*img+R3);LSF = LSF + step*(Length + Penalty + RSFterm);#plt.imshow(s, cmap ='gray'),plt.show();return LSF;Image = cv2.imread(r'D:\Desktop\image-81.png',1);# Image = Image1[70:430,90:410]
# print(Image.shape)
image = cv2.cvtColor(Image,cv2.COLOR_BGR2GRAY)
# print(image.shape)
img = np.float64(image)
# print(img[:,250])
# print(img.shape)#Kernel
sig=3;
kernel = np.ones((sig*4+1,sig*4+1),np.float64)/(sig*4+1)**2;IniLSF = np.ones((img.shape[0],img.shape[1]),img.dtype);
# print(IniLSF.shape)
# IniLSF[200:300,200:300]= -1;
IniLSF[235:236,209:210]= -1;
print(IniLSF)
# print(IniLSF[:,55])
IniLSF=-IniLSF;
####################################################################################
#
# Image = cv2.cvtColor(Image,cv2.COLOR_BGR2RGB);
# plt.figure(1);
# DrawContour(IniLSF,'r',2); # Draw contour# print(Image.shape)
# b = Image[:, :, 0]
# g = Image[:, :, 1]
# r = Image[:, :, 2]# img_array = np.asarray(b)
# print("输出图像数组:",img_array)
# print("数组形状:",img_array.shape)
#
# r.show()
# for j in range(300):# print(b.shape)# print(b.getpixel((150,j)))# im = Image.shape[2]##########################################################################################mu = 1;
nu = 0.003 * 255 * 255;
num = 50;
epison = 1;
step = 0.1;
lambda1=lambda2=1;
LSF=IniLSF;for i in range(1,num):LSF = RSF(LSF, img, mu, nu, epison,step,lambda1,lambda2,kernel);if i % 5 == 0:    DrawContour(LSF,'r',2);plt.show()
cv2.imshow("tx",LSF)
cv2.waitKey(0)print(LSF.shape)
print(LSF[:,280])

用于医学图像分割,自己跑一下效果一般,还需要改改,加些预处理.

李纯明博士的RSF算法源码.水平集医学图像分割相关推荐

  1. [unity3d]recast navigation navmesh 导航网格 寻路算法 源码分析

    recast navigation navmesh导航网格算法源码分析 Author:  林绍川 recast navigation navmesh是unity3d ue4内置的寻路算法 本文为了方便 ...

  2. 基于新唐M0的XXTEA加密解密算法源码

    源:基于新唐M0的XXTEA加密解密算法源码 /*--------------------------------------------------------------------------- ...

  3. [转] GIS算法源码集合

    其他GIS相关代码下载索引 http://www.mygis.com.cn/codeindex10.htm 1.深度优先实现的路径分析源码 http://www.mygis.com.cn/codes/ ...

  4. 机器学习算法源码全解析(三)-范数规则化之核范数与规则项参数选择

    前言 参见上一篇博文,我们聊到了L0,L1和L2范数,这篇我们絮叨絮叨下核范数和规则项参数选择.知识有限,以下都是我一些浅显的看法,如果理解存在错误,希望大家不吝指正.谢谢. 机器学习算法源码全解析( ...

  5. Learning to Rank中Pointwise关于PRank算法源码实现

    [学习排序] Learning to Rank中Pointwise关于PRank算法源码实现 标签: 学习排序PRankPointwiseLearning to Rank代码实现 2015-01-28 ...

  6. 超像素SLIC算法源码阅读

    超像素SLIC算法源码阅读 超像素SLIC算法源码阅读 SLIC简介 源码阅读 实验结果 其他超像素算法对比 超像素SLIC算法源码阅读 SLIC简介 SLIC的全称Simple Linear Ite ...

  7. Java自动计算迷宫正确路线算法源码

    简介: Java自动计算迷宫正确路线算法源码,首先迷宫需要满足存在开始标识和结束标识与墙标识,然后设置好行数与列数就可以开始计算正确路线了,采用的是为二维数组然后走遍所有路线的方式. 网盘下载地址: ...

  8. Metis异常检测算法源码概要

    Metis异常检测算法源码概要 算法源码目录 算法层目录 基于指数移动平均算法(EWMA) 孤立森林 xgboost gbdt 3-Sigma 多项式回归 特征层目录 拟合特征 分类特征 统计特征 其 ...

  9. LeGo-LOAM激光雷达定位算法源码阅读(二)

    文章目录 1.featureAssociation框架 1.1节点代码主体 1.2 FeatureAssociation构造函数 1.3 runFeatureAssociation()主体函数 2.重 ...

最新文章

  1. 程序员常用网址,必须收藏
  2. 在一表中设置组合主键(两个字段组合成一个主键)
  3. 【WSN同步捕获】无线传感器网络的同步捕获和跟踪误差的MATLAB仿真
  4. java正则表达式的菜鸟使用分析
  5. 【工作笔记】ElasticSearch —— 常用插件/工具汇总
  6. orbeon form 的架构简介 - 如何访问用户通过 form 存储的数据
  7. linux之tail 命令
  8. hdu 4293 Groups DP
  9. css新单位 vw , vh
  10. selenium3 + java 日志
  11. 10大热门人工智能开源工具(框架)
  12. 《我们应当怎样做需求分析》阅读笔记
  13. android http 本地 web服务(tomcat)
  14. 竞品分析 | 荔枝VS喜马拉雅FM:有声音频APP的发展与社交
  15. 现代数字信号处理总结 下
  16. linux yml文件格式,YML 文件扩展名: 它是什么以及如何打开它?
  17. 什么是超大附件?邮箱的超大附件怎么打开?哪个邮箱发送附件大?
  18. openstack compute service list报错(HTTP 503)
  19. vue-router.esm.js?3423:2065 Uncaught (in promise) NavigationDuplicated: Avoided redundant navig错误解析
  20. PHP 图片上传 图片压缩

热门文章

  1. Linux下装Matlab2014
  2. 统计学习方法 第二章 感知机
  3. EAUML日拱一卒--序列图(Sequence Diagram)::交互和交互使用
  4. 微信聊天记录如何恢复
  5. 解决:ERROR: Cannot uninstall ‘certifi‘. It is a distutils installed project and thus we cannot accurat
  6. 打造移动应用与游戏安全防线,腾讯WeTest安全服务全线升级
  7. Android输入事件从读取到分发三:InputDispatcherThread线程分发事件的过程
  8. 计算机私密相册安全吗,手机照片到底藏在哪里才不会被别人随便就翻看到
  9. 魔兽世界自建服务器,魔兽世界怀旧服
  10. SSM+酒店管理系统的设计和实现 毕业设计-附源码260839