Python第三方库之MedPy

2023-11-03

文章目录

1.MedPy简介

MedPy 是一个图像处理库和针对医学(如高维)图像处理的脚本集合,此处主要讨论利用该库计算常见的医学图像分割任务评价指标,如Dice、Jaccard、Hausdorff Distance、Sensitivity、Specificity、Positive predictive value等。

论文表格的表头一般使用评价指标的英文全称首字母大写简写,如PPV代表阳性预测值,故此处也给出。

  • Dice相似系数(Dice Similarity Coefficient,DSC)或Dice系数(Dice Coefficient,DC)

    也称为索伦森-骰子系数是用于衡量两个样本相似性的统计量。它是由植物学家Thorvald Sørensen和Lee Raymond Dice独立开发的,他们分别于1948年和1945年发表。是最常用的一项评价指标,用于有效衡量分割算法预测标签与真实标注标签的空间重叠程度,其对应值越大表示分割精度越高。该指标最初应用于离散数据,给定两个集合A 和B,则定义为两个集合共有的元素数除以每个集合中元素数之和的两倍
    D S C = 2 ∣ A ∩ B ∣ ∣ A ∣ + ∣ B ∣ DSC=\frac{2|A\cap B|}{|A|+|B|} DSC=A+B2∣AB
    其中, ∣ A ∣ |A| A ∣ B ∣ |B| B是两个集合的基数(即每个集合中的元素数)

    当应用于布尔数据时,使用真阳性 (TP)、假阳性(FP) 和假阴性(FN) 的定义,它可以写为
    D S C = 2 T P 2 T P + F P + F N D S C=\frac{2 T P}{2 T P+F P+F N} DSC=2TP+FP+FN2TP

  • Jaccard相似系数(Jaccard Similarity Coefficient,JSC)或Jaccard系数(Jaccard Coefficient,JC)

    与 Dice 相似系数指标相似,也是一种衡量两幅图像相似程度的指标,其由实际分割结果与真实标签的交集同二者并集的比值得出,反映了分割方法的准确程度,其值越高,分割结果越准确。设TP表示正确预测为正例的数量,FP表示错误预测为正例的数量,FN表示错误预测为反例的数量,则定义为

     Jaccard = T P T P + F P + F N \text { Jaccard}=\frac{T P}{T P+F P+F N}  Jaccard=TP+FP+FNTP

  • 豪斯多夫距离(Hausdorff distance,HD)

    表示预测分割区域边界与真实肿瘤区域边界之间的最大距离,其值越小代表脑肿瘤边界分割误差越小、质量越好。设 XY 是度量空间 ( M , d ) (M,d) (M,d)的两个非空子集,则定义他们的Hausdorff distance d H ( X , Y ) d_H(X,Y) dH(X,Y)
    d H ( X , Y ) = max ⁡ { d X Y , d Y X } = max ⁡ { max ⁡ x ∈ X min ⁡ y ∈ Y d ( x , y ) , max ⁡ y ∈ Y min ⁡ x ∈ X d ( x , y ) } d_H(X, Y)=\max \left\{d_{X Y}, d_{Y X}\right\}=\max \left\{\max _{x \in X} \min_{y \in Y}d(x, y), \max _{y \in Y} \min _{x \in X} d(x, y)\right\} dH(X,Y)=max{dXY,dYX}=max{xXmaxyYmind(x,y),yYmaxxXmind(x,y)}
    计算绿色曲线 X 和蓝色曲线 Y 之间的豪斯多夫距离的分量过程如下图所示。

    首先,对点集X中的每一个点 x x x计算其到点集Y中的每一个点 y y y的距离,保留最短距离 inf ⁡ x ∈ X d ( x , y ) \inf_{x \in X}d(x,y) infxXd(x,y),然后找出保留的最短距离中的最大距离 sup ⁡ y ∈ Y inf ⁡ x ∈ X d ( x , y ) \sup_{y \in Y}{\inf_{x \in X}d(x,y)} supyYinfxXd(x,y)记为 d X Y d_{XY} dXY。然后,对点集Y中的每一个点 y y y计算其到点集X中的每一个点 x x x的距离,保留最短距离 inf ⁡ y ∈ Y d ( x , y ) \inf_{y \in Y}d(x,y) infyYd(x,y),然后找出保留的最短距离中的最大距离 sup ⁡ x ∈ X inf ⁡ y ∈ Y d ( x , y ) \sup_{x \in X}{\inf_{y \in Y}d(x,y)} supxXinfyYd(x,y)记为 d Y X d_{YX} dYX。最后,取 d X Y d_{XY} dXY d Y X d_{YX} dYX最大值作为点集X和Y之间的豪斯多夫距离。

在这里插入图片描述

  • 95% 豪斯多夫距离(95% Hausdorff distance,HD95)

    为了排除一些离群点造成的不合理距离,保持整体数值稳定性,一般选择从小到大排名前 95%的距离作为实际豪斯多夫距离,称之为 95% 豪斯多夫距离。

  • 灵敏度(Sensitivity)

    也称真阳性率(True Positive Rate)、命中率(hit rate)和召回率(Recall),表示预测为正的肿瘤标签占真实肿瘤标签的比例,其值越大,漏检率越低。设P表示数据中真阳样例的数量,TP表示正确预测为正例的数量,FN表示错误预测为反例的数量,则定义为
    S e n s i t i v i t y = T P R = R e c a l l = T P P = T P T P + F N = 1 − F N R \mathrm{Sensitivity}=\mathrm{TPR}=\mathrm{Recall}=\frac{\mathrm{TP}}{\mathrm{P}}=\frac{\mathrm{TP}}{\mathrm{TP}+\mathrm{FN}}=1-\mathrm{FNR} Sensitivity=TPR=Recall=PTP=TP+FNTP=1FNR

  • 特异度(Specificity)

    也称真阴性率(True Negative Rate)和选择性(Selectivity),表示预测为正的背景标签占所有真实背景标签的比例,其值越高则误诊率越低。设N表示数据中真阴样例的数量,TN表示正确预测为负例的数量,FP表示错误预测为正例的数量,则定义为
    S p e c i f i c i t y = S e l e c t i v i t y = T N R = T N N = T N T N + F P = 1 − F P R \mathrm{Specificity}=\mathrm{Selectivity}=\mathrm{TNR}=\frac{\mathrm{TN}}{\mathrm{N}}=\frac{\mathrm{TN}}{\mathrm{TN}+\mathrm{FP}}=1-\mathrm{FPR} Specificity=Selectivity=TNR=NTN=TN+FPTN=1FPR

  • 阳性预测值(Positive Predictive Value,PPV)

    也称精确度(Precision),指在所有样本的预测结果中,真阳性占所有阳性样本的比例,其值越大越好。设TP表示正确预测为正例的数量,FP表示错误预测为正例的数量,则定义为
    P r e c i s i o n = P P V = T P T P + F P = 1 − F D R \mathrm{Precision}=\mathrm{PPV}=\frac{\mathrm{TP}}{\mathrm{TP}+\mathrm{FP}}=1-\mathrm{FDR} Precision=PPV=TP+FPTP=1FDR

2.MedPy安装

medpy安装较为简单,此处以Ubuntu 18.04.5 LTS系统的root用户为例,其他情况详见参考文献安装即可。

为了启用graph-cut包,我们需要安装下列软件包

sudo apt-get install libboost-python-dev build-essential

然后使用阿里云镜像源高速安装medpy

sudo pip install medpy -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

3.MedPy常用函数

3.1 medpy.io.load(image)

加载图像并返回包含图像像素内容以及头部对象的 ndarray

import os
from medpy.io import load,save
# 文件夹路径和文件名
dirname="/dataset/RSNA_ASNR_MICCAI_BraTS2021_TrainingData_16July2021/BraTS2021_00000/"
basename="BraTS2021_00000_seg.nii.gz"
full_path=os.path.join(dirname,basename)
# 加载脑肿瘤标记图像返回图像数据数组和头部信息
image_data, image_header = load(full_path)
print("图像数据类型为{},图像数据形状为{}".format(type(image_data),image_data.shape))

在这里插入图片描述

# 获取一个切片数组
slice_0=image_data[:,:,77]
print("切片数组的形状为{},切片数组的数据类型为{}".format(slice_0.shape,slice_0.dtype))

在这里插入图片描述

# 转置显示灰度图
plt.imshow(slice_0.T, cmap="gray")

在这里插入图片描述

# 将纵坐标设置为对数尺度,等宽区间数量设置为为8个绘制切片数组灰度直方图
plt.hist(image_data.flatten(), bins=8, log=True)

在这里插入图片描述

3.2 medpy.metric.binary.dc(result, reference)

计算二值图像之间的Dice系数(也称为索伦森指数)

首先编辑第三方库源代码在最后追加一行输出语句,保存退出后重启kernel。该输出语句指示此时调用的numpy定义,若调用dc函数前有输出,则表示调用依赖numpy的函数,否则调用依赖jax.numpy的兼容函数实现加速运算

vim /opt/conda/lib/python3.7/site-packages/medpy/metric/binary.py

然后定义统一的一个数组大小参数,最后使用魔术命令%%timeit评估CPU和GPU计算两种方法的运行效率

# 设置数组形状为10000*10000的元组
tup=(10000,10000)
  • 调用依赖numpy的函数

    %%timeit
    from medpy.metric.binary import dc
    import numpy as np
    # 设置伪随机数种子
    seed=np.random.seed(6)
    # 定义预测结果和真实标记数组
    predict=np.random.randint(0,4,size=tup)
    ground_truth=np.random.randint(0,4,size=tup)
    # 计算Dice相似系数
    dice1=dc(predict,ground_truth)
    print("Dice相似系数为{}".format(dice1))
    

在这里插入图片描述

  • 调用依赖jax.numpy的兼容函数

    %%timeit
    from medpy.metric.binary import dc
    import jax.numpy as numpy # 重载numpy定义使得dc函数底层可以加速计算
    from jax import random
    # 设置伪随机数种子
    rng1=random.PRNGKey(1)
    rng2=random.PRNGKey(2)
    # 定义预测结果和真实标记数组
    predict=random.randint(key=rng1,shape=tup,minval=0,maxval=4)
    ground_truth=random.randint(key=rng2,shape=tup,minval=0,maxval=4)
    # 计算Dice相似系数
    dice2=dc(predict,ground_truth)
    print("Dice相似系数为{}".format(dice2))
    

在这里插入图片描述

3.3 medpy.metric.binary.jc(result, reference)

计算两个图像中二值对象间的Jaccard系数,下面通过两种方式计算

  • 直接调用第三方库函数计算jaccard系数
%%timeit
from medpy.metric.binary import jc
import jax.numpy as numpy
from jax import random
# 设置伪随机数种子
rng1=random.PRNGKey(1)
rng2=random.PRNGKey(2)
# 定义预测结果和真实标记数组
predict=random.randint(key=rng1,shape=tup,minval=0,maxval=4)
ground_truth=random.randint(key=rng2,shape=tup,minval=0,maxval=4)
# 直接计算Jaccard相似系数
jaccard=jc(predict,ground_truth)
print("Jaccard相似系数为{}".format(jaccard))

在这里插入图片描述

  • 通过Dice系数和Jaccard系数的如下关系推导计算

J a c c a r d = D i c e 2 − D i c e Jaccard=\frac{Dice}{2-Dice}\nonumber Jaccard=2DiceDice

%%timeit
from medpy.metric.binary import dc
import jax.numpy as numpy
from jax import random
# 设置伪随机数种子
rng1=random.PRNGKey(1)
rng2=random.PRNGKey(2)
# 定义预测结果和真实标记数组
predict=random.randint(key=rng1,shape=tup,minval=0,maxval=4)
ground_truth=random.randint(key=rng2,shape=tup,minval=0,maxval=4)
# 通过Dice相似系数推导Jaccard相似系数
dice=dc(predict,ground_truth)
jaccard=dice/(2-dice)
print("通过Dice相似系数推导Jaccard相似系数为{}".format(jaccard))

在这里插入图片描述

  • 对比两种计算结果、源代码实现、运行效率可知,两种方式结果一样但通过Dice系数推导Jaccard系数运行效率更高,其原因是将一个统计非零值的 O ( n ) O(n) O(n)时间复杂度的函数替换成了 O ( 1 ) O(1) O(1)时间复杂度的简单推导。

3.4 medpy.metric.binary.hd(result,reference,voxelspacing=None,connectivity=1,)

计算两个图像中二值对象之间的(对称)豪斯多夫距离(HD)。它被定义为对象之间的最大表面距离。

%%timeit
from medpy.metric.binary import hd,hd95
import jax.numpy as numpy
from jax import random
# 设置伪随机数种子
rng1=random.PRNGKey(1)
rng2=random.PRNGKey(2)
# 定义预测结果和真实标记数组
predict=random.randint(key=rng1,shape=(50,50),minval=0,maxval=4)
ground_truth=random.randint(key=rng2,shape=(50,50),minval=0,maxval=4)
# 计算豪斯多夫距离
hausdorff_distance=hd(predict,ground_truth)
print("豪斯多夫距离为{}".format(hausdorff_distance))

在这里插入图片描述

3.5 medpy.metric.binary.hd95(result,reference,voxelspacing=None,connectivity=1,)

计算两个图像中二值对象之间的(对称)豪斯多夫距离 (HD) 的第 95 个百分位数。与豪斯多夫距离相比,该指标对于小异常值稍微稳定一些,通常用于生物医学分割挑战。

%%timeit
from medpy.metric.binary import hd,hd95
import jax.numpy as numpy
from jax import random
# 设置伪随机数种子
rng1=random.PRNGKey(1)
rng2=random.PRNGKey(2)
# 定义预测结果和真实标记数组
predict=random.randint(key=rng1,shape=(50,50),minval=0,maxval=4)
ground_truth=random.randint(key=rng2,shape=(50,50),minval=0,maxval=4)
# 计算95%豪斯多夫距离
hausdorff_distance95=hd95(predict,ground_truth)
print("95%豪斯多夫距离为{}".format(hausdorff_distance95))

在这里插入图片描述

3.6 medpy.metric.binary.recall(result, reference)

返回召回率

%%timeit
from medpy.metric.binary import recall
import jax.numpy as numpy
from jax import random
# 设置伪随机数种子
rng1=random.PRNGKey(1)
rng2=random.PRNGKey(2)
# 定义预测结果和真实标记数组
predict=random.randint(key=rng1,shape=(50,50),minval=0,maxval=4)
ground_truth=random.randint(key=rng2,shape=(50,50),minval=0,maxval=4)
# 计算召回率/灵敏度/真阳性率
sensitivity=recall(predict,ground_truth)
print("召回率/灵敏度/真阳性率为{}".format(sensitivity))

在这里插入图片描述

3.7 medpy.metric.binary.sensitivity(result, reference)

返回灵敏度,内部实现直接调用recall

%%timeit
from medpy.metric.binary import sensitivity
import jax.numpy as numpy
from jax import random
# 设置伪随机数种子
rng1=random.PRNGKey(1)
rng2=random.PRNGKey(2)
# 定义预测结果和真实标记数组
predict=random.randint(key=rng1,shape=(50,50),minval=0,maxval=4)
ground_truth=random.randint(key=rng2,shape=(50,50),minval=0,maxval=4)
# 计算召回率/灵敏度/真阳性率
recall=sensitivity(predict,ground_truth)
print("召回率/灵敏度/真阳性率为{}".format(recall))

在这里插入图片描述

3.8medpy.metric.binary.true_positive_rate(result, reference)

返回真阳性率,内部实现直接调用recall

%%timeit
from medpy.metric.binary import true_positive_rate
import jax.numpy as numpy
from jax import random
# 设置伪随机数种子
rng1=random.PRNGKey(1)
rng2=random.PRNGKey(2)
# 定义预测结果和真实标记数组
predict=random.randint(key=rng1,shape=(50,50),minval=0,maxval=4)
ground_truth=random.randint(key=rng2,shape=(50,50),minval=0,maxval=4)
# 计算召回率/灵敏度/真阳性率
sensitivity=true_positive_rate(predict,ground_truth)
print("召回率/灵敏度/真阳性率为{}".format(sensitivity))

在这里插入图片描述

3.9medpy.metric.binary.specificity(result, reference)

返回特异度

%%timeit
from medpy.metric.binary import specificity
import jax.numpy as numpy
from jax import random
# 设置伪随机数种子
rng1=random.PRNGKey(1)
rng2=random.PRNGKey(2)
# 定义预测结果和真实标记数组
predict=random.randint(key=rng1,shape=(50,50),minval=0,maxval=4)
ground_truth=random.randint(key=rng2,shape=(50,50),minval=0,maxval=4)
# 计算特异度/真阴性率
tnr=specificity(predict,ground_truth)
print("特异度/真阴性率为{}".format(tnr))

在这里插入图片描述

3.10medpy.metric.binary.true_negative_rate(result, reference)

返回真阴性率

%%timeit
from medpy.metric.binary import true_negative_rate
import jax.numpy as numpy
from jax import random
# 设置伪随机数种子
rng1=random.PRNGKey(1)
rng2=random.PRNGKey(2)
# 定义预测结果和真实标记数组
predict=random.randint(key=rng1,shape=(50,50),minval=0,maxval=4)
ground_truth=random.randint(key=rng2,shape=(50,50),minval=0,maxval=4)
# 计算特异度/真阴性率
specifity=true_negative_rate(predict,ground_truth)
print("特异度/真阴性率为{}".format(specifity))

在这里插入图片描述

3.11medpy.metric.binary.precision(result, reference)

返回精确度

%%timeit
from medpy.metric.binary import precision
import jax.numpy as numpy
from jax import random
# 设置伪随机数种子
rng1=random.PRNGKey(1)
rng2=random.PRNGKey(2)
# 定义预测结果和真实标记数组
predict=random.randint(key=rng1,shape=(50,50),minval=0,maxval=4)
ground_truth=random.randint(key=rng2,shape=(50,50),minval=0,maxval=4)
# 计算精确度/阳性预测值
Precision=precision(predict,ground_truth)
print("精确度/阳性预测值为{}".format(Precision))

在这里插入图片描述

3.12 medpy.metric.binary.positive_predictive_value(result, reference)

返回阳性预测值

%%timeit
from medpy.metric.binary import positive_predictive_value
import jax.numpy as numpy
from jax import random
# 设置伪随机数种子
rng1=random.PRNGKey(1)
rng2=random.PRNGKey(2)
# 定义预测结果和真实标记数组
predict=random.randint(key=rng1,shape=(50,50),minval=0,maxval=4)
ground_truth=random.randint(key=rng2,shape=(50,50),minval=0,maxval=4)
# 计算精确度/阳性预测值
ppv=positive_predictive_value(predict,ground_truth)
print("精确度/阳性预测值为{}".format(ppv))

在这里插入图片描述

3.13 medpy.io.save(arr, filename, hdr=False, force=True, use_compression=False)

使用“hdr”中编码的信息将图像“arr”保存为文件名。目标图像格式由“文件名”后缀确定。如果“force”参数设置为 true,以静默方式覆盖已存在的映像。否则将引发错误。

import os
from medpy.io import load,save
# 文件夹路径和文件名
dirname="/dataset/RSNA_ASNR_MICCAI_BraTS2021_TrainingData_16July2021/BraTS2021_00000/"
basename="BraTS2021_00000_seg.nii.gz"
full_path=os.path.join(dirname,basename)
# 加载脑肿瘤标记图像返回图像数据数组和头部信息
image_data, image_header = load(full_path)
# 将图像数据保存为BraTS2021_00000_seg.nii
save(image_data,"BraTS2021_00000_seg.nii")

在这里插入图片描述

4.参考文献

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python第三方库之MedPy 的相关文章

  • Python 和 Numpy 是 nan 和 set

    我在使用 Python 的 Numpy set 和 NaN 非数字 时遇到了不可预测的行为 gt gt gt set np float64 nan np float64 nan set nan nan gt gt gt set np flo
  • 如何指定聚类的距离函数?

    我想对给定距离的点进行聚类 奇怪的是 似乎 scipy 和 sklearn 聚类方法都不允许指定距离函数 例如 在sklearn cluster AgglomerativeClustering 我唯一可以做的就是输入一个亲和力矩阵 这将非常
  • 为什么我的混淆矩阵只返回一个数字?

    我正在做二元分类 每当我的预测等于事实时 我发现sklearn metrics confusion matrix返回单个值 难道没有问题吗 from sklearn metrics import confusion matrix print
  • ValueError:请使用“Layer”实例初始化“TimeDistributed”层

    我正在尝试构建一个可以在音频和视频样本上进行训练的模型 但出现此错误ValueError Please initialize TimeDistributed layer with a Layer instance You passed Te
  • 从字典的元素创建 Pandas 数据框

    我正在尝试从字典创建一个 pandas 数据框 字典设置为 nvalues y1 1 2 3 4 y2 5 6 7 8 y3 a b c d 我希望数据框仅包含 y1 and y2 到目前为止我可以使用 df pd DataFrame fr
  • 如何为未捕获的异常处理程序编写单元测试

    我有一个函数可以捕获uncaught例外情况 如下 有没有办法编写一个单元测试来执行uncaught exception handler 功能正常 但测试正常退出 import logging def config logger logge
  • Python re无限执行

    我正在尝试执行这段代码 import re pattern r w w s re compiled re compile pattern results re compiled search COPRO HORIZON 2000 HOR p
  • 指示电子邮件的类型

    我有以下自动化程序 它将电子邮件发送给我自己 并添加了特定的链接 import win32com client as win32 import easygui import tkinter as to from tkinter import
  • 如何获取numpy.random.choice的索引? - Python

    是否可以修改 numpy random choice 函数以使其返回所选元素的索引 基本上 我想创建一个列表并随机选择元素而不进行替换 import numpy as np gt gt gt a 1 4 1 3 3 2 1 4 gt gt
  • OpenCV 跟踪器:模型未在函数 init 中初始化

    在视频的第一帧 我运行一个对象检测器 它返回对象的边界框 如下所示
  • 如何在 Python 中的函数入口、内部和退出处进行日志记录

    我希望能够使用 Python 日志记录工具在我的代码中进行简单且一致的日志记录 我能够执行以下操作 我希望所有现有 未来的模块和函数都有 输入 和 完成 日志消息 我不想添加相同的代码片段来定义日志记录参数 如下所示don t want t
  • 在Python中读取tiff标签

    我正在尝试用 Python 读取 tiff 文件的标签 该文件是 RGB 的uint16每个通道的值 我目前正在使用tifffile import tifffile img tifffile imread file tif 然而 img是一
  • Python“非规范化”unicode 组合字符

    我正在寻找标准化 python 中的一些 unicode 文本 我想知道是否有一种简单的方法可以在 python 中获得组合 unicode 字符的 非规范化 形式 例如如果我有序列u o xaf i e latin small lette
  • 使用标签或 href 传递 Django 数据

    我有一个包含链接的表 当单击该链接进行更多操作时 我想将一些数据传递给我的函数 my html table tbody for query in queries tr td value a href internal my func que
  • 使用seaborn绘制简单线图

    我正在尝试使用seaborn python 绘制ROC曲线 对于 matplotlib 我只需使用该函数plot plt plot one minus specificity sensitivity bs where one minus s
  • Python守护进程:保持日志记录

    我有一个将一些数据记录到磁盘的脚本 logging basicConfig filename davis debug log level logging DEBUG logging basicConfig filename davis er
  • 使用 selenium 和 python 来提取 javascript 生成的 HTML?萤火虫?

    这里是Python新手 我遇到的是数据收集问题 我在这个网站上 当我用 Firebug 检查我想要的元素时 它显示了包含我需要的信息的源 然而常规源代码 没有 Firebug 不会给我这个信息 这意味着我也无法通过正常的 selenium
  • numpy polyfit 中使用的权重值是多少以及拟合误差是多少

    我正在尝试对 numpy 中的某些数据进行线性拟合 Ex 其中 w 是该值的样本数 即对于点 x 0 y 0 我只有 1 个测量值 该测量值是2 2 但对于这一点 1 1 我有 2 个测量值 值为3 5 x np array 0 1 2 3
  • 高效创建抗锯齿圆形蒙版

    我正在尝试创建抗锯齿 加权而不是布尔 圆形掩模 以制作用于卷积的圆形内核 radius 3 no of pixels to be 1 on either side of the center pixel shall be decimal a
  • django jet 中的自定义徽标

    我目前正在尝试对 django 管理面板的皮肤进行一些定制 以使其更符合我们的品牌 目前我们使用 django jet 来美化管理面板 django jet 可以自定义 css html 吗 所有评论都说我应该更改一些 html 文件 但我

随机推荐

  • python自动化课程笔记(十一)封装、继承、多态

    class Dog object good dog 说明文档 def init self new name color age 5 self name new name self color color self age age def s
  • Tomcat安装及部署

    Aphorism 安装 忽略下载过程 1 解压文件 把 tomcat 安装包解压到 D Program Files 下 2 启动 tomcat 在 tomcat 文件包的 bin 文件夹中 双击 startup bat 文件启动tomcat
  • 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。(C++实现)

    题目介绍 给定一个链表 删除链表的倒数第 n 个节点 并且返回链表的头结点 示例 给定一个链表 1 gt 2 gt 3 gt 4 gt 5 和 n 2 当删除了倒数第二个节点后 链表变为 1 gt 2 gt 3 gt 5 说明 给定的 n
  • Oil Deposits

    http poj org problem id 1562 Oil Deposits Description The GeoSurvComp geologic survey company is responsible for detecti
  • 10个超炫超有用的js库/插件

    原文地址 http blog csdn net shyy123 article details 7471782 1 CodeMirror CodeMirror 是一款 Online Source Editor 基于 Javascript 短
  • MyEclipse集成PMD代码检测插件自定义规则配置文件

    把我今天最新更新的MyEclipse2014集成PMD代码检测插件自定义规则配置文件JAVA版发布出来吧 方便自己以后回顾的同时 也看看能不能帮到有这方面需求的小伙伴们 文件名 cplatform pmd5 2 3 rules xml
  • Android.bp文件简介

    Android bp Android bp的出现就是为了替换Android mk文件 bp跟mk文件不同 它是纯粹的配置 没有分支 循环等流程控制 不能做算数逻辑运算 如果需要控制逻辑 那么只能通过Go语言编写 语法 根据设计 Androi
  • 为什么opencv用GPU实现比用CPU实现的慢?

    问题 打算通过OpenCV的GPU模块优化现有代码的运行效率 怀抱着美好愿望开始了代码的改写工作 改写的过程并不顺利 遇到了不少问题 例如 gpu模块提供的接口非常坑爹 相当一部分不支持浮点类型 像histogram integral这类常
  • SpringCloud实践(四) 通过Feign组件实现消费者

    在前面使用了RestTemplate和Ribbon来实现了服务消费者 Feign 是一个集成了Ribbon和Eureka的组件 通过声明的方式 就可以实现Http客户端 简化了http客户端 服务消费者 对于Feign 我们只要记得两个特点
  • Aspose工具实现word和ppt转pdf功能及遇到的一些问题

    Aspose工具包从word和ppt转到pdf的实现过程 直接放项目地址 说一下实现过程中遇到的坑 直接放项目地址 https github com lichangliu1098 File2Pdf 说一下实现过程中遇到的坑 jar包的引入
  • Zabbix部署详细步骤

    以下是在Ubuntu上安装Zabbix的详细步骤 1 更新系统 使用以下命令更新Ubuntu系统 sudo apt get update sudo apt get upgrade 2 安装依赖项 在安装Zabbix之前 需要先安装一些依赖项
  • 教你快速上手Flex弹性盒布局(容器属性)

    目录 简介 一 Flex布局语法 1 1 display flex 二 Flex属性 三 容器属性 3 1 flex direction 3 2 flex direction row 3 3 flex direction row rever
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为 2023A卷和2023B卷 你收
  • Tachyon内存文件系统

    Tachyon内存文件系统 Tachyon是以内存为中心的分布式文件系统 拥有高性能和容错能力 能够为集群框架 如Spark MapReduce 提供可靠的内存级速度的文件共享服务 从软件栈的层次来看 Tachyon是位于现有大数据计算框架
  • 使用GitHub的一些小知识合集

    文章目录 一 FastGithub 1 稳定可靠的github加速神器 FastGithub 2 github加速神器 FastGithub 二 README md添加图片 1 怎么给README md添加图片 两种方法 图文教程 2 在R
  • OpenCV代码提取:morphologyEx函数的实现

    Morphological Operations A set of operations that process images based on shapes Morphological operations apply a struct
  • keil软件安装与破解

    目录 目录 下载 安装 破解 下载 学习51单片机必要的开发工具是 KEIL C51 下载密码dsfs 安装 按照一般安装软件顺序即可 此处随便填写 破解 注意 需以管理员身份 运行 按照如下图片步骤 弹出如下对话框 再打开软件按如下操作
  • 解决pycharm错误:Error updating package list: connect timed out解决

    方法是在 Manage Repositories 中 修改数据来源 默认的是 https pypi python org simple 我们可将其替换为如下的几个数据来源 这些都是国内的pip镜像 清华 https pypi tuna ts
  • Vue3 emits选项将Emit派发事件可以对参数进行验证。

    Vue官方建议我们在组件中所有的emit事件都能在组件的emits选项中声明 emits参数有俩种形式对象和数组 对象里面可以配置带校验emit事件 为null的时候代表不校验 校验的时候 会把emit事件的参数传到校验函数的参数里面 当校
  • Python第三方库之MedPy

    文章目录 1 MedPy简介 2 MedPy安装 3 MedPy常用函数 3 1 medpy io load image 3 2 medpy metric binary dc result reference 3 3 medpy metri