精华内容
下载资源
问答
  • 基于深度学习医学图像分割(一)

    万次阅读 多人点赞 2020-05-21 10:18:46
    由于医学图像自身的复杂,在分割过程中需要解决均匀及个体差异等一系列问题,所以一般的图像分割方法难以直接应用于医学图像分割。当前,医学图像分割仍在从手动分割或半自动分割向全自动分割发展。 图像分割的...

    医学图像分割是医学图像处理与分析领域的复杂而关键的步骤,其目的是将医学图像中具有某些特殊含义的部分分割出来,并提取相关特征,为临床诊疗和病理学研究提供可靠的依据,辅助医生作出更为准确的诊断。由于医学图像自身的复杂性,在分割过程中需要解决不均匀及个体差异等一系列问题,所以一般的图像分割方法难以直接应用于医学图像分割。当前,医学图像分割仍在从手动分割或半自动分割向全自动分割发展。

       图像分割的定义:
    
       令R代表整个图像区域,对R的分割可看做将R分成若干个满足以下条件的非空子集(子区域){R1,R2,R3…Rn}。该集合满足以下特性:
    
          目前国内外广泛应用的医学图像分割方法有很多种,许多学者试应用数学、物理、光学、计算机等领域知识拓展医学图像分割的理论方法。  
    
          图像分割方法可以分为以下几类:
    

    (1)基于阈值的分割:通过阈值对不同的物体进行分割。

    阈值分割是最常见的并行直接检测区域的分割方法。[2]如果只用选取一个阈值称为单阈值分割,它将图像分为
    目标和背景;如果需用多个阈值则称为多阈值方法,图像将被分割为多个目标区域和背景,为区分目标,
    还需要对各个区域进行标记。阈值分割方法基于对灰度图像的一种假设:目标或背景内的相邻像素间的灰度值是
    相似的,但不同目标或背景的像素在灰度上有差异,反映在图像直方图上就是不同目标和背景对应不同的峰。
    选取的阈值应位于两个峰之间的谷,从而将各个峰分开。

     阈值分割的优点是实现相对简单,对于不类的物体灰度值或其他特征值相差很大时,能很有效的对图像进行分割。
     阈值分割通常作为医学图像的预处理,然后应用其他一系列分割方法进行后处理。
    
     阈值分割的缺点是不适用于多通道图像和特征值相差不大的图像,对于图像中不存在明显的灰度差异或各物体的灰
     度值范围有较大重叠的图像分割问题难以得到准确的结果。另外,由于它仅仅考虑了图像的灰度信息而不考虑图像
     的空间信息,阈值分割对噪声和灰度不均匀很敏感。
    
     阈值选取的几种方法为直方图阈值分割法、类间方差阈值分割法、二维最大熵值分割法和模糊阈值分割法。
    

    (2)基于边缘的分割:先确定边缘像素,并把它们连接在一起,以构成所需的边界

    基于边缘的分割方法可以说是人们最早研究的方法,基于在区域边缘上的像素灰度值的变化往往比较剧烈,它试图
    通过检测不同区域间的边缘来解决图像分割问题。边缘检测技术可以按照处理的技术分为串行边缘检测以及并行边
    缘检测。所谓串行边缘检测是指:要想确定当前像素点是否属于欲检测边缘上的一点,取决于先前像素的验证结
    果;而在并行边缘检测技术中,一个像素点是否属于检测边缘上的一点取决于当前正在检测的像素点以及该像素点
    的一些相邻像素点,这样该模型可以同时用于图像中的所有像素点,因而称之为并行边缘检测技术。 根据灰度变化
    的特点,常见的边缘可分为跃阶型、房顶型和凸缘型。

       边缘检测分为三类:点检测、线检测和边缘检测。点检测是检测图像中孤立的点,线检测主要是哈夫变换,利用
       图像全局特性而直接检测目标轮廓,即可将边缘像素连接起来组成区域封闭边界的常用方法。边缘检测依据两个
       具有不同灰度值的相邻区域之间总存在边缘,边缘检测算子很多,如梯度算子,方向算子,拉普拉斯算子,马尔
       算子,综合正交算子,坎尼算子等。
    

    代码实现传统算子的图形分割:下图中分别是:原图——>sobel算子水平检测器——>sobel 算子垂直检测器——>拉普拉斯算子——>Canny算子(其余的边缘检测方式,下期介绍)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rNRck2HA-1590026487168)(C:\Users\acer\AppData\Roaming\Typora\typora-user-images\1590024454173.png)]

    (3)基于区域的分割:把各像素划归到各个物体或区域中

    图像分割-把图像分解为若干个有意义的子区域,而这种分解-基于物体有平滑均匀的表面,与图像中强度恒定或缓慢变化的区域相对应,即每个子区域都具有一定的均匀性质前面所讨论的边缘、阈值,没有明显使用分割定义中的均匀测度度量区域分割-直接根据事先确定的相似性准则,直接取出若干特征相近或相同象素组成区域。常用的区域分割-区域增长(区域生长)、区域分裂-合并方法等。

    区域生长和分裂合并是两种典型的串行区域分割方法。其特点是将分割过程分解为顺序的多个步骤,其中后续步骤要根据前面步骤的结果进行判断而确定。
    区域生长的基本思想是将具有相似性质的像素集合起来构成区域,该方法需要先选取一个种子点,然后依次将种子像素周围的相似像素合并到种子像素所在的区域中。区域生长算法的研究重点一是特征度量和区域增长规则的设计,二是算法的高效性和准确性。区域增长方式的优点是计算简单。与阈值分割类似,区域增长也很少单独使用,往往是与其他分割方法一起使用,特别适用于分割小的结构如肿瘤和伤疤。区域生长的缺点是它需要人工交互以获得种子点,这样使用者必须在每个需要抽取出的区域中植入一个种子点。同时,区域增长方式也对噪声敏感,导致抽取出的区域有空洞或者在局部体效应的情况下将分开的区域连接起来。为解决这些问题,J.F. Mangin 等提出了一种同伦的区域生长方式,以保证初始区域和最终抽取出的区域的拓扑结构相同。Shu-Yen Wan 等提出的对称区域增长算法有效地弥补了原算法对种子点敏感和占用内存多的弱点,而且对3D连接对象标记和删除空洞的算法效率较高。另外,模糊连接度方法与区域增长相结合也是一个发展方向。

    区域生长方法将图像以像素为基本单位来进行操作。主要方法可以基于区域灰度差,基于区域内灰度分布统计性质,或基于区域形状

    分裂合并方法利用图像数据的金字塔或四叉树结构的层次概念,将图像划分为一组任意不相交的初始区域,即可以从图像的这种金字塔或四叉树数据结构的任一中间层开始,根据给定的均匀性检测准则,进行分裂和合并这些区域,逐步改善区域划分的性能,知道最后将图片分成数量最少的均匀区域为止。

    (4)基于运动的分割:通过视频物体运动进行分割

    随着多媒体技术的发展,视频图像得到广泛应用,由一系列时间上连续的2-D图像组成。
    从空间分割的角度来看,视频图像分割主要是希望把其中独立运动的区域(目标)逐帧检测处理。
    从时间分割的角度来看,主要是把连续的序列分解为时间片断。
    

    (5) 基于活动轮廓模型的方法
    活动轮廓模型,又称Snake模型,由Kass在1987年提出。由于 Snake模型有着高效的数值方案以及严谨的数学基础,且应用广泛,提出后即成为图像分割领域所研究的热点。

    原始的Snake模型其基本思想是通过能量最小化,将一条带有能量函数的初始曲线朝着待检测的目标轮廓方向逐步
    变形与运动,最终收敛到目标边界,得到一个光滑并且连续的轮廓。原始Snake模型首先在目标区域附近手动设置
    一条闭合曲线作为Snake模型的初始轮廓线,初始轮廓线随时间不断演化,越来越逼近目标边界,当演化停止时即
    获得最终结果。Snake算法的3个主要步骤为:(1)读取数据;(2)数据的预处理,如图像的去噪、求梯度,求外力场
    等;(3)确定模型的参数与迭代次数,然后开始迭代。
    
    原始的Snake模型存在难以捕捉目标凹陷边界及对初始轮廓线敏感等不足,因而后续有许多改进的方法。在此也不过多描述。
    

    (6)模糊聚类算法

    大多数的医学图像具有模糊性,图像质量低、噪声大。模糊聚类法将模糊集理论与聚类算法相结合,模糊集理论对图像的不确定性具备较好描述能力,将此特点结合到分类中,应用到医学图像分割领域。该方法不是以“一刀切”的方式将像素点硬性分到某一区域,而是引入模糊理论中“隶属度”的概念,将像素点分到隶属程度高的区域中去,提高分割的准确率。目前最常用的是模糊C- 均值算法 (FCM),该算法通过两次迭代得到最优边界。

    (7)基于小波变换的方法

    小波变换是对Fourier分析的继承与发展,利用小波变换进行医学图像分割的基本方法是通过小波变换将图像直方图分解成不同级别的系数,用尺度控制并依照小波系数和给定的分割准则来选择阈值。小波变换在较大尺度上由噪音引起的细小突变较少,容易描述医学图像信号的整体行为,可检测出医学图像灰度值变化较大的轮廓,因此可以通过在不同尺度下逐步确定阈值来处理医学图像。

    以上7类均为传统分割方法。每一种都有诸多变形与改进。还有基于图论、图谱引导、数学形态学等等研究。但主要任务是用深度算法研究医学图像中的分割任务。


    下面介绍医学图像中常用的损失函数,包括cross entropy, generalized dice coefiicients, focal loss 等。

    一、cross entropy 交叉熵

    图像分割中最常用的损失函数是逐像素交叉熵损失。该损失函数分别检查每个像素,将类预测(深度方向的像素向量)与我们的热编码目标向量进行比较。

    cross entropy

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N09RKPYC-1590026487170)(D:\CSDN\pic\医学影像分割(一)\1590025000076.png)]

    由此可见,交叉熵的损失函数单独评估每个像素矢量的类预测,然后对所有像素求平均值,所以我们可以认为图像中的像素被平等的学习了。但是,医学图像中常出现类别不均衡(class imbalance)的问题,由此导致训练会被像素较多的类主导,对于较小的物体很难学习到其特征,从而降低网络的有效性。

    有较多的文章对其进行了研究,包括 Long et al. 的 FCN 在每个通道加权该损失,从而抵消数据集中存在的类别不均的问题。同时,Ronneberger et al.提出的 U-Net 提出了新的逐像素损失的加权方案,使其在分割对象的边界处具有更高的权重。该损失加权方案以不连续的方式帮助他们的 U-Net 模型细分生物医学图像中的细胞,使得可以在二元分割图中容易地识别单个细胞。

    二、dice coefficient

    dice coefficient 源于二分类,本质上是衡量两个样本的重叠部分。该指标范围从0到1,其中“1”表示完整的重叠。 其计算公式为:

    ​                    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cm3INElS-1590026487175)(D:\CSDN\pic\医学影像分割(一)\1590025144245.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OFMtMWk7-1590026487181)(D:\CSDN\pic\医学影像分割(一)\1590025214653.png)]

    intersection

    因为我们的目标是二进制的,因而可以有效地将预测中未在 target mask 中“激活”的所有像素清零。对于剩余的像素,主要是在惩罚低置信度预测; 该表达式的较高值(在分子中)会导致更好的Dice系数。

    其中,在式子中 Dice系数的分子中有2,因为分母“重复计算” 了两组之间的共同元素。为了形成可以最小化的损失函数,我们将简单地使用1-Dice。这种损失函数被称为 soft dice loss,因为我们直接使用预测概率而不是使用阈值或将它们转换为二进制mask。

      关于神经网络输出,分子涉及到我们的预测和 target mask 之间的共同激活,而分母将每个mask中的激活量分开考
      虑。实际上起到了利用 target mask 的大小来归一化损失的效果,使得 soft dice 损失不会难以从图像中具有较小空
      间表示的类中学习。
    
      soft dice loss 将每个类别分开考虑,然后平均得到最后结果。
    

    dice loss比较适用于样本极度不均的情况,一般的情况下,使用 dice loss 会对反向传播造成不利的影响,容易使训练变得不稳定。

    三、focal loss

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-heEzeRU9-1590026487184)(D:\CSDN\pic\医学影像分割(一)\1590025802658.png)]

    因此,对于大量的easy negative examples,这些loss会主导梯度下降的方向,淹没少量的正样本的影响。

    该损失函数在何凯明 1-stage 目标检测框架中被提出。专为解决 class imbalance 问题。首先定性感受一下 target 	
    problem(基于目标检测背景):
    

    在目标检测领域,常用的损失函数为CE(cross entropy)。但会带来一些问题:

    (1)首先,在目标检测中,一般图像的目标所占的比例会远远小于背景,在传统的样本分类中,被分为 positive 和 negative 两类。由于 negative 样本过多,会造成它的loss太大,容易把 positive 的 loss 遮盖从而不利于整个目标函数的收敛,针对这个问题,用平衡的CE (balanced cross entropy)改进传统CE

    (2)实际上,大多negative 样本位于背景区,而极少的 negative 位于前景和背景的过渡区。位于背景区的样本分类相对容易,成为easy negative, 训练时对应的score很大,loss 相对很小,在计算反向梯度时,造成easy negative example对参数收敛作用有限。从而导致hard negative 样本很难得到更新,效果不佳。

    究其原因,是由于常用的损失函数,传统CE(cross entropy)包括平衡化的 CE 均只有 positive/ negative 的区分,未考虑到 easy/ hard 的样本区分。根据分类,有以下几类样本:hard positive(IOU>0.5), easy positive, hard negative(IOU<0.4) 以及 easy negative。

    所以提出了focal loss 加大 hard negative的 loss值,使之更好的训练。

    主要就是增加了 调节因子。调节因子有两方面作用:1)当网络错分类的时候,p_{t} 很小,公式基本不变,但当 p_{t} 很大,大大降低了 easy example 的损失权重。2) focusing parameter, gamma增强了调节因子的作用。

    整体上看,调节因子降低了 easy example 损失的贡献,调节了简单样本权重降低的速率,并拓宽了样本接收低损失的范围。对于困难样本的学习更有利。值得注意的是, \alpha 和调节因子需要配合使用,具体实现时,可以参考论文中的实验进一步探究。

    本文引用博主「Biyoner」的文章,下一章我把常用的以学影像图像分割算法全部罗列一遍,并且附上源码,感兴趣的朋友可以关注一下,一起学习深度学习,加油!

    另外推荐一下我自己的微信群,群中都是学习深度学习的,与群里的深度学习工程师们一起交流学习吧!
    在这里插入图片描述

    上海第二工业大学智能科学与技术大二 周小夏(CV调包侠)

    展开全文
  • 纸币在流通过程中不可避免地引入各种污染,会影响纸币序列号正常分割,甚至引发分割失败。为了提高分割结果准确,提出了一种预测先验知识字符分割方法。对于某种面值纸币,根据其特有号码排列方式定义...
  • 并将其应用于灰度图像边缘判定问题,利用变精度粗糙集的上下近似定义,构造了变精度灰色形态学算子,依据灰度图像粗糙熵的定义,提出一种基于VPRS粗糙熵的图像分割算法。针对噪声图像,该方法用变精度粗糙集模型判断...
  • 的定义与实现 理解类 理解类 类是具有相同或相似性质的对象的抽象抽象是从众多的事物中抽取出共同的本质性的特征而舍弃其非本质的特征的过程 类还起到封装的作用封装有两个含义 一是把对象的全部属性和行为结合在...
  • 针对CT图像中因噪声、密度分布均匀和边界模糊等因素造成肺气管树难以准确分割的问题,提出了一种区域生长与模糊连接度相结合肺气管树分割流程。通过阈值化及形态学闭操作提取出肺实质以定义感兴趣区域;采用改进...
  • 两个状态必须同时为可接受状态(终态)或者不可接受状态(非终态)——一致条件 对于所有输入符号,两个状态接受相同符号必须转换到等价状态——蔓延条件 2.分割法 我们首先将其分为终态和非终态 P0P_0...

    3.4.4 确定有穷自动机的化简

    1.化简的有穷自动机的定义

    一个没有多余状态并且没有两个状态是等价的有穷自动机。

    多余状态(无用状态):从该自动机的开始状态出发,任何输入串也不能到达的那个状态

    等价状态:

    1. 两个状态必须同时为可接受状态(终态)或者不可接受状态(非终态)——一致性条件
    2. 对于所有的输入符号,两个状态接受相同的符号必须转换到等价的状态——蔓延性条件

    2.分割法

    在这里插入图片描述

    我们首先将其分为终态和非终态

    在这里插入图片描述

    P0P_0 = ({1, 2, 3, 4}, {5, 6, 7})

    接下来我们尝试先对{1, 2, 3, 4}这个子集进行划分

    1a61\stackrel{a}{\longrightarrow}61b31\stackrel{b}{\longrightarrow}3

    2a72\stackrel{a}{\longrightarrow}72b32\stackrel{b}{\longrightarrow}3

    3a13\stackrel{a}{\longrightarrow}13b53\stackrel{b}{\longrightarrow}5

    4a44\stackrel{a}{\longrightarrow}44b64\stackrel{b}{\longrightarrow}6

    首先我们看如果输入a的话,1和2的输出为{5,6,7}这个集合中的元素,而3和4则仍是本集合的元素,所以根据等价状态的第二性质,我们可以将1、2 与3、4分割开。

    在这里插入图片描述

    P1P_1 = ({1, 2}, {3, 4}, {5, 6, 7})

    对于目前这个新的集合来说,我们继续划分每个子集。首先从{1,2}开始

    1a61\stackrel{a}{\longrightarrow}61b31\stackrel{b}{\longrightarrow}3

    2a72\stackrel{a}{\longrightarrow}72b32\stackrel{b}{\longrightarrow}3

    我们无论是对1,2输入a还是输入b,它们的输出都属于同一个集合——6、7属于{5,6,7}这个终态集合,3属于{3,4}这个集合,所以{1,2}这个集合很完美,无法划分(即状态无法区分),它俩好得跟一个人似的。

    在这里插入图片描述

    那么我们继续看{3,4}

    3a13\stackrel{a}{\longrightarrow}13b53\stackrel{b}{\longrightarrow}5

    4a44\stackrel{a}{\longrightarrow}44b64\stackrel{b}{\longrightarrow}6

    哦,我们看到,当输入a的时候,3输出的是1,属于{1,2}集合;4则输出的是4,属于{3,4}集合,所以3和4的状态可区分。

    在这里插入图片描述

    那么更新我们的状态图

    在这里插入图片描述

    更新P

    P2P_2 = ({1,2}, {3}, {4}, {5, 6, 7})

    很明显我们的故事还没结束,还有{5,6,7}这个集合

    5a75\stackrel{a}{\longrightarrow}75b35\stackrel{b}{\longrightarrow}3

    6a46\stackrel{a}{\longrightarrow}46b16\stackrel{b}{\longrightarrow}1

    7a47\stackrel{a}{\longrightarrow}47b27\stackrel{b}{\longrightarrow}2

    很明显,在输入a的时候,5的输出为7即{5,6,7} 本集合内的,而6、7则是输出的同一个集合。二话不说,分家!

    在这里插入图片描述

    P3P_3 = ({1,2}, {3}, {4}, {5}, {6, 7})

    这时候,还剩{6,7},如果你上面看明白了,那么到这里你也就懂了,6、7是不可区分的状态。

    分割法到此结束……

    ……不还有最后一步,把所有的不可区分状态统统用其中一个状态来表示就行。

    比如1、2,我们直接用1来代替就行,把2所有的输入和输出的压力都放到1身上

    在这里插入图片描述

    1b31\stackrel{b}{\longrightarrow}32b32\stackrel{b}{\longrightarrow}3 所以这两个线用一个就行)

    然后我们发现6、7可以直接用6代替

    在这里插入图片描述

    把虚线收拾干净再看看

    在这里插入图片描述

    在这里插入图片描述

    3.The End

    在这里插入图片描述

    展开全文
  • 1)把对象全部属性和对属性操作结合在起,形成一个不可分割的独立单位(即对象)。 Java是一种纯粹面向对象程序设计语言,除了基本数据类型(如整型、浮点型等),Javn中数据都以对象形式存在,将属性和操作封装...

    封装性

    Java的封装性就是把对象的属性和对属性的操作结合成一个独立的单位,并尽可能的隐藏内部的细节。 它包含两个含义:

    1)把对象的全部属性和对属性的操作结合在起,形成一个不可分割的独立单位(即对象)。
    Java是一种纯粹的面向对象程序设计语言,除了基本数据类型(如整型、浮点型等),Javn中的数据都以对象的形式存在,将属性和操作封装在对象中,它没有游离于类之外的属性和方法,可以有效实现细节隐藏。

    2)信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界,只保留有限的对外公开接口使之与外部发生联系,这一点通过Java包Java类及其成员的访问权限实现。 可以理解为黑盒子,日常用品之类的商业用品。只给你可以应用的部分。

    1类与对象

    类是Java面向对象程序设计中最基本的程序单元。 编写Java程序时,首先创建类,然后通过类创建不同的对象。 当程序运行时,对象有对应的内存空间存储其具体的属性值,通过对象激活相应的方法(方法访问内存),实现一定的功能。

    1.1类的定义

    Java文件中中能有一个同名类,且只有它能被public修饰

    java中通过class关键字进行定义:类声明和类体

    1. )类声明:创建一个新的对象类型
    public class muchu{  //关键字class前可以有访问权限public也可以没有
          //类体
                  }
    
    1. )类体:定义一个类,就可以在类体中定义;两个类形成员:属性和方法

    1、属性的定义
    属性的定义分为两种:
    基本数据类型
    对象类型:通过class关键字定义的对象类型

    c语言基本数据类型 /位 Java基本数据类型 /位
    char 1 char16
    short 2 $short16
    int 4 int32
    long 4 long64
    longlong 8
    float 4 float8
    double 8 double64
    longdouble 8
    boolean1
    byte8
    	public class Muchu{
    		private float x;
    		private float y;
    }
    
    	public class Shankong{
    		private Muchu mu1;
    		private Muchu mu2;
    }
    

    ·类Muchu两个访问权限为“private”属性,x,y的基本数据类型为float(基本数据类型)。
    ·类Shankong的两个访问权限位private属性,其为对象类型。其中private表示的属性是私有的,只有该类的内部可以访问。

    2、方法的定义

    方法的定义格式包括方法的访问权限、方法名字、方法的参数列表、返回类型和方法体。
    ·参数类型和方法的返回类型对象类型基本数据类型

    3、构造方法的定义
    实质就是 初始化参数
    1.)它具有与类名相同的名称
    2.)它没有返回值(如果有,则不是构造方法,而是和构造方法同名的成员方法)

    3).构造方法的调用时机与一般的方法不同。一般的方法是在需要时才调用,而构造方法则是创建对象时自动调用,并执行构造方法的内容。因此,构造方法无需在程序中直接调用,而是在对象产生时自动执行。
    4).基于上述构造方法的特性,可利用它来对对象的数据成员做初始化的赋值;

    5).在类中没有声明任何的构造方法,系统会自动为类加入一个无参的且什么都不做的构造方法,类似于下面的代码:
    public Person(){}

    6).一但用户自定义了构造方法则系统不再提供无参构造方法。用户手动添加一个(是不是一定要添加?)

    7).构造方法虽然可以被私有了,但并不一定说此类不能产生实例化对象,只是产生这个实例化对象的位置有所变化,即只能在本类中产生实例化对象。

    例子:Java编译器为其提供的缺省构造方法

    public Muchu(){
    }
    
    数据类型 缺省值
    基本数据类型 0
    boolean false
    char \0
    对象类型变量 null

    函数构造方法的定义部分转载于:https://blog.csdn.net/ClinEvol/article/details/82870454

    1.2对象的创建和使用

    1、对象的声明
    Java中的对象类似于c语言的指针,对象变量声明后,系统将分配32位地址空间(4个字节),并且空间为null。

    例子:声明类Muchu 的对象变量mu
    Muchu mu;

    2、对象的创建

    new一个对象,只有在对象变量声明后,通过new关键字调用类的的构造函数创建对象,然后后才可以使用对象变量。

    Muchu mu = new Muchu(x,y);
    

    每次new一个对象都会创建一个类的新的对象,并且分配内存空间。
    对象变量的存储地址不可修改,仅仅可以通过访问他的指向的对象的地址。

    3、对象的使用
    如果要访问对象里的某个成员变量或方法,可以通过下面的语法来实现:

    对象名称.属性名     //访问属性
    对象名称.方法名()     //访问方法
    

    例如,想访问Person类中的name和age属性,可用如下方法来访问:

    p1.name;   //访问Person类中的name属性
    p1.age;    //访问Person类中的age属性
    

    因此若想将Person类的对象p中的属性name赋值为“张三”,年龄赋值为25,则可采用下面的写法:

    p1.name = "张三" ;
    p1.age = 25 ;
    

    如果想调用Person中的talk()方法,可以采用下面的写法:

    p1.talk();   //调用Person类中的talk()方
    

    1.3方法的形式参数和实际参数的传递方式

    Java形参和实参的结合方式为值传递。 与形参的数据类型无关。

    假设 通过Muchu muchu1 = new Muchu(100,200);创建了一个对象m1,定义两个方法changeOne()和changeTwo(),并将muchu1作为实参传递给两个方法。

    public static void changeOne (Muchu m1){
    	m1 = new Muchu(78,156);
    }
    
    public static void changeTwo(Muchu m1){
    	m1.setX(15);
    }
    

    m1作为形参,由于是值传递,实际参数muchu1会把其存储的地址拷贝到形参m1中,此时形参和实参是不同内存同一地址。

    方法changeOne()的调用不会影响实参的和实参指向的对象。(只修改了形参的值,没修改指向的对象的值)
    方法changeTwo()的调用不会影响实参,单会影响实参指向的对象。(方法修改了形参指向的对象的属性值)

    1.4方法重载

    在Java中,同一个类中的多个方法可以有相同的方法名称,但是有不同的参数列表,这就称为方法重载(method overloading)。

    参数列表又叫参数签名,包括参数的类型、参数的个数、参数的顺序(有顺序),只要有一个不同就叫做参数列表不同。

    重载是面向对象的一个基本特性。

    public class Demo {
     
    	//一个普通得方法,不带参数,无返回值
    	public void add(){
    		//method body
    	}
    	
    	//重载上面的方法,并且带了一个整形参数,无返回值
    	public void add(int a){
    		//method body
    	}
    	
            //重载上面的方法,并且带了两个整型参数,返回值为int型
    	public int add(int a,int b){
    		//method body
    		return 0;
    	}
     
    }
    

    通过上面的例子,不难看出,重载就是在一个类中,有相同的函数名称,但形参不同的函。重载的结果,可以让一个程序段尽量减少代码和方法的种类。

    说明:

    ·参数列表不同包括:个数不同、顺序不同、类型不同。
    ·仅仅参数变量名称不同是不可以的。
    ·跟成员方法一样,构造方法也可以重载。
    ·声明为final的方法不能被重载。
    ·声明为static的方法不能被重载,但是能够被在此声明。

    方法的重载的规则:

    方法名称必须相同。
    参数列表必须不同。
    方法的返回类型可以相同也可以不相同。
    仅仅返回类型不同不足以称为方法的重载。
    方法重载的实现:
    方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错,这叫做重载分辨

    方法重载转于:https://blog.csdn.net/xkfanhua/article/details/80561673

    展开全文
  • 这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过事务,SQL Server能将逻辑相关一组操作绑定在一起,以便服务器保持数据完整。 (2):事务通常是以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK...

    (1):事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。
    (2):事务通常是以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。
    COMMIT表示提交,即提交事务的所有操作。具体地说就是将事务中所有对数据库的更新写回到磁盘上的物理数据库中去,事务正常结束。
    ROLLBACK表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有以完成的操作全部撤消,滚回到事务开始的状态。
    (3):事务运行的三种模式:
    A:自动提交事务
              每条单独的语句都是一个事务。每个语句后都隐含一个COMMIT。
    B:显式事务
           以BEGIN TRANSACTION显式开始,以COMMIT或ROLLBACK显式结束。
    C:隐性事务
           在前一个事务完成时,新事务隐式启动,但每个事务仍以COMMIT或ROLLBACK显式结束。
    (4):事务的特性(ACID特性)
    A:原子性(Atomicity)
           事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。
    B:一致性(Consistency)
           事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
    C:隔离性(Isolation)
          一个事务的执行不能被其他事务干扰。
    D:持续性/永久性(Durability)
          一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
    注:事务是恢复和并发控制的基本单位。

    统观spring事务,围绕着两个核心PlatformTransactionManager和TransactionStatus 

    spring提供了几个关于事务处理的类: 
    TransactionDefinition //事务属性定义
    TranscationStatus //代表了当前的事务,可以提交,回滚。
    PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类AbstractPlatformTransactionManager,我们使用的事务管理类例如DataSourceTransactionManager等都是这个类的子类。

    一般事务定义步骤:

    TransactionDefinition td = new TransactionDefinition();
    TransactionStatus ts = transactionManager.getTransaction(td);
    try
    { //do sth
    transactionManager.commit(ts);
    }
    catch(Exception e){transactionManager.rollback(ts);}


    spring提供的事务管理可以分为两类:编程式的和声明式的。编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活。

    编程式主要使用transactionTemplate。省略了部分的提交,回滚,一系列的事务对象定义,需注入事务管理对象.

    void add()
    {
        transactionTemplate.execute( new TransactionCallback(){
            pulic Object doInTransaction(TransactionStatus ts)
           { //do sth}
        }
    }


    声明式:

    使用TransactionProxyFactoryBean:
    <bean id="userManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
       <property name="transactionManager"><ref bean="transactionManager"/></property>
       <property name="target"><ref local="userManagerTarget"/></property>
       <property name="transactionAttributes">
        <props>
         <prop key="insert*">PROPAGATION_REQUIRED</prop>
         <prop key="update*">PROPAGATION_REQUIRED</prop>
         <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
        </props>
       </property>
    </bean>


    围绕Poxy的动态代理 能够自动的提交和回滚事务
    org.springframework.transaction.interceptor.TransactionProxyFactoryBean

    • PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
    • PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
    • PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
    • PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
    • PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
    • PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
    • PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
    展开全文
  • ** 一、什么叫做事务 ** 事务是数据库操作最小...事务是一个不可分割的整体,是数据库逻辑工作单位,事务中操作要么都做,要么都不做。 C:一致(Consistency) 事务执行结果必须是从数据库从一个一致状态
  • 数据库事务定义以及特性

    千次阅读 2013-12-04 15:42:43
    所谓事务,它是一个操作集合,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。 典型例子就像从网上银行系统帐户A转帐到帐户B,它经过两个阶段:1.从帐户A取出款项。2.把款项放入帐户B中。这两...
  • VQ-VAE + Transformer真香!其中用到了Performer模型,表现SOTA!性能优于AE等网络。...病理脑部外观可能如此异质,以致仅理解为异常,异常是由其偏离正常状态而不是任何特定病理特征定义的。 在医学成像中最艰
  • MySQL事务四大特性和隔离级别 ...原子(atomicity):一个事务必须视为一个不可分割的最小单元,整个事务中所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行成功其...
  • 图像分割技术(1)

    2018-04-19 17:24:39
    图像分割综述:针对单色图像分割通常基于处理灰度值两类特性:连续和相似。第一类中,方法是以灰度突变为基础分割一幅图像,比如图像边缘。第二类中,主要方法是根据一组预定义的准则将一幅图像分割为...
  • 在训练数据线性不可分时,如何定义此情形下支持向量机最优化问题。如何设置 CvSVMParams 中参数来解决此类问题。 动机 为什么需要将支持向量机优化问题扩展到线性不可情形? 在多数计算机视觉...
  • 线性表 线性表指是n≥0个元素a1, a2, a3…有序数列,并且线性表元素具有原子,即结构上是不可分割的一个整体。 广义表(Generalized list) 而广义表则是线性表一种扩展延伸。相对于线性表,广义表最大...
  • 问题:并发编程中的原子性是什么?数据库的ACID中,A也是指原子性,这两个...所以,并发编程中的原子性,强调的是一个操作的不可分割性。 所以,在并发编程中,原子性的定义不应该和事务中的原子性完全一样。 它应...
  • 1.事务定义 事务是一个工作单元,对数据库执行。事务是在一个逻辑顺序,无论是由用户手动或某种数据库程序... 原子(Atomic):事务被视为不可分割的最小单元,事务所有操作要么全部提交成功,要么全部失败回滚...
  • 原子性:定义不可分割的操作。单个指令可以是原子的,多个指令通过加锁的方式也可以实现原子性。原子性可以是针对单核多线程,也可以针对多核多线程。 1)单核多线程:原子性的指令不可以被中断,一定要执行完...
  • 故模糊理论将模糊概念以模糊集合的定义,将事件属于某集合程度的隶属函数加以模糊量化,得到隶属度,来处理问题。 模糊聚类就是用模糊数学的方法,把样本之间的模糊关系定量,从而客观准确地进行聚类,使得各个类...
  • 是一个最小的不可分割的工作单元,能保证一个业务完整。事务中可能包含一个或多个sql语句,这些语句要么都执行,要么都不执行。题目:银行转帐,a 账户向 b 账户转100元。分析:a 账户减少100元,同时,b 账户...
  • 故模糊理论将模糊概念以模糊集合的定义,将事件属于某集合程度的隶属函数加以模糊量化,得到隶属度,来处理问题。 模糊聚类就是用模糊数学的方法,把样本之间的模糊关系定量,从而客观准确地进行聚类,使得各个类...
  • 数据库可靠

    2020-08-20 20:38:02
    一个事务是一个不可分割的工作单位,事务在执行时,应该遵守“要么不做,要么全做”(Nothing or All)原则,即不允许完成部分事务。 一致 事务对数据库作用是数据库从一个一致状态转变到另一个一致状态。...
  • 原子是世界上最小单位,具有不可分割性。比如 i=1,这个操作是不可分割,那么我们说这个操作是原子操作。再比如:i++,这个操作实际是i= i+ 1,包括读取i,i+1,将结果写入内存 三个操作,是可以分割,所以他...
  • 数据库用了很久了,最近看书又看到了ACID,突然想起来原子就是不可分割, 既然是这样,那应该就可以保证一致,为什么数据库事务定义了4个特性.   其实这个问题症结在怎么理解原子,以前学物理时候,留下了一...
  • 文章目录数据库范式第一范式:原子第二范式:唯一第三范式:关联字段约束主键约束非空约束唯一约束外键约束外建约束闭环问题字符集、校对规则定义 ...◆ 数据表得每一列都是不可分割得基本...
  • 9.1平面图 定义: 平面图(planar graph):图G可以画在平面上使得任意两条边都...区域:一个平图将当前平面分割一些"连通片"(我更倾向于称为"部分",指二维面)。 外区域:一个平图区域中总有一个是无...
  • 所谓事务是用户定义的一个操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。事务开始与结束可以由用户显式控制。如果用户没有显式地定义事务,则由DBMS按缺省规定自动划分事务。在SQL语言中,定义...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,194
精华内容 477
关键字:

不可分割性的定义