精华内容
下载资源
问答
  • 分水岭算法用于分割多个相邻的物体。原理灰度图像根据灰度值可以把像素之间的关系看成山峰和山谷的关系,高亮度(灰度值高)的地方是山峰,低亮度的地方是山谷。给每个孤立的山谷(局部最小值)不同颜色的水(label...

    分水岭算法

    用于分割多个相邻的物体。

    原理

    灰度图像根据灰度值可以把像素之间的关系看成山峰和山谷的关系,高亮度(灰度值高)的地方是山峰,低亮度的地方是山谷。给每个孤立的山谷(局部最小值)不同颜色的水(label),当水涨起来,根据周围的山峰(梯度),不同的山谷也就是不同的颜色会开始合并,要避免这个,可以在水要合并的地方建立障碍,直到所有山峰都被淹没。所创建的障碍就是分割结果,这个就是分水岭的原理,但是这个方法会分割过度,因为有噪点,或者其他图像上的错误。所以OpenCV实现的分水岭算法,可以指定哪些是要合并的点,哪些不是,我们要做的是给不同的标签。给我们知道是前景或者是目标用一种颜色加上标签,给我们知道是背景或者非目标加上另一个颜色,最后不知道是什么的区域标记为0。

    这篇文章翻译地很好了:

    OpenCV-Python教程:31.分水岭算法对图像进行分割

    markers = cv2.watershed(img, markers)

    # img: 8-bit 3-channel image

    # markers: 32-bit single-channel

    # markers(input): 0表示未知区域, 其他正数表示确定是不同物体的标签

    # markers(output): -1表示是边界

    # 初始化marker的基本套路

    img = cv2.imread('xxx.png')

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

    # noise removal

    kernel = np.ones((3,3), np.uint8)

    opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations = 2)

    # sure background area

    sure_bg = cv2.dilate(opening, kernel, iterations=3)

    # Finding sure foreground area

    dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)

    ret, sure_fg = cv2.threshold(dist_transform, 0.7*dist_transform.max(), 255, 0)

    # Finding unknown region

    sure_fg = np.uint8(sure_fg)

    unknown = cv2.subtract(sure_bg, sure_fg)

    # Marker labelling

    ret, markers = cv2.connectedComponents(sure_fg)

    # Add one to all labels so that sure background is not 0, but 1

    markers = markers + 1

    # Now, mark the region of unknown with zero

    markers[unknown==255] = 0

    GrabCut算法

    mask = cv2.grabCut(img, mask, rect, bgdModel, fgdModel, iterCount, mode=None)

    """

    img: 8-bit 3-channel image

    mask: 8-bit single-channel 最终的结果,shape和img一样

    当mode设置为cv2.GC_INIT_WITH_MASK时,需要用户自己对mask进行初始化

    矩阵里面只有四个值:

    GC_BGD = 0, //背景

    GC_FGD = 1, //前景

    GC_PR_BGD = 2, //可能背景

    GC_PR_FGD = 3 //可能前景

    rect: 一块矩形区域,矩形外面一定是背景,当mode设置为cv2.GC_INIT_WITH_RECT时,才会使用

    bgdModel, fgdModel: 算法过程中用到的临时矩阵,不用管,传None即可

    mode:

    cv2.GC_INIT_WITH_RECT

    cv2.GC_INIT_WITH_MASK

    """

    RECT可以通过findContour等方式获得

    获得mask之后,从源图像中提取前景的方法

    mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')

    img = img * mask2[:, :, np.newaxis]

    展开全文
  • 在如果您需要它进行图像分割,我建议您使用ITKsnap,监督学习,分割包,它使用随机森林,并在python中实现。这很简单,你可以插入或定义你的标签和训练你的数据。你可以玩你的学习参数,如树的数量或深度。这是一个...

    下面是python中的一个随机森林实现。在

    如果您需要它进行图像分割,我建议您使用ITKsnap,监督学习,分割包,它使用随机森林,并在python中实现。

    这很简单,你可以插入或定义你的标签和训练你的数据。你可以玩你的学习参数,如树的数量或深度。

    这是一个如何对大脑数据进行分割的示例:import numpy as np

    import csv as csv

    from sklearn.ensemble import RandomForestClassifier

    from sklearn.model_selection import GridSearchCV

    from sklearn.cross_validation import StratifiedKFold # Add important libs

    # Training:

    train=[]

    test=[] #Array Definition

    path1 = r'D:\random forest\data set\train.csv' #Address Definition

    path2 = r'D:\random forest\data set\test.csv'

    with open(path1, 'r') as f1: #Open File as read by 'r'

    reader = csv.reader(f1)

    next(reader, None) #Skip header because file header is not needed

    for row in reader: #fill array by file info by for loop

    train.append(row)

    train = np.array(train)

    with open(path2, 'r') as f2:

    reader2 = csv.reader(f2)

    next(reader2, None)

    for row2 in reader2:

    test.append(row2)

    test = np.array(test)

    train = np.delete(train,[0],1)

    test = np.delete(test,[0],1)

    # Optimization

    parameter_gridsearch = {

    'max_depth' : [3, 4], #depth of each decision tree

    'n_estimators': [50, 20], #count of decision tree

    'max_features': ['sqrt', 'auto', 'log2'],

    'min_samples_split': [2],

    'min_samples_leaf': [1, 3, 4],

    'bootstrap': [True, False],

    }

    # RF classification

    randomForestClassifier()

    crossvalidation = StratifiedKFold(train[0::,0] , n_folds=5)

    gridsearch = GridSearchCV(randomforest, #grid search for algorithm optimization

    scoring='accuracy',

    param_grid=parameter_gridsearch,

    cv=crossvalidation)

    gridsearch.fit(train[0::,1::], train[0::,0]) #train[0::,0] is as target

    model = gridsearch

    parameters = gridsearch.best_params_

    展开全文
  • 我们可能会遇到一个问题:我们只需要图片的一部分区域,如何把图片中的某部分区域提取出来 或者 图像想要的区域用某种颜色(与其它区域颜色不一致)标记起来 ,以上描述的问题在像处理领域称为 图像分割。...

    做图像处理时,我们可能会遇到一个问题:我们只需要图片的一部分区域,如何把图片中的某部分区域提取出来 或者 图像想要的区域用某种颜色(与其它区域颜色不一致)标记起来 ,以上描述的问题在像处理领域称为 图像分割。

    说了这么多,可能还是有读者不知所云,这里我在下面放置了一张图,就是图像分割的一个应用,图像的前后对比,可以看到 人物 通过算法被很清晰地分割了出来,方便后续物体的识别跟踪。

    这篇文章给大家介绍的就是 Opencv 中的一种图像分割方法 — 分水岭算法,先介绍一下这个算法所用到的基本原理:把图像比喻成一个平面,图像灰度值高的区域被看作山峰,灰度值低的地方被看作山谷,不同区域的山谷我们可以用不同颜色来标记,但是随着标记区域不断扩大,会出现一种现象:不同山谷的交汇处区域会出现颜色错乱现象,为了防止这一现象的出现,要做的就是把高峰变得更高(改变灰度值),然后再用颜色标记,如此反复最后完成所所有山谷的颜色分割,以上就是 涉及分水岭算法基本原理。

    说的简单一点,就是根据图像相邻的像素插值,分成不同区域;分水岭算法就是将不同区域染成不同颜色;分水岭分割算法最大的特征就是 区域的封闭性;

    Opencv 包中的分水岭算法利用的不是原算法,而是在原算法基础上又改进了一下,加了一步预处理(因为原算法经常会造成图像过度分割):在分割之前先要设置那些山谷会出现汇合,那些不会;如果我i们能够确定该点代表的是要分割的对象,那么就用某个颜色或者灰度值标签标记它,如果不是就利用另一种颜色去标记它。随后的过程就是分水岭算法。当所有山谷区域都分割完毕之后,得到的边界对象值设置为 -1;

    ​本次算法用到的图片实例

    ·

    分水岭算法的具体使用步骤:

    首先利用 cv2 读取图片,把 图片转变为灰质图,然后做阈值筛选,之前提到过的Otsu ' s 二值化 ,变成下面的二值图片(两色图),至于如何二值化的,可以参照之前写的这篇文章:zeroing:OpenCv 中的【图像阈值化处理】-- 我们经常用到的技术!​zhuanlan.zhihu.comzhihu-card-default.svg

    ;代码如下:

    import cv2

    import numpy as np

    from matplotlib import pyplot as plt

    import cv2

    import numpy as np

    from matplotlib import pyplot as plt

    img1 = cv2.imread('F:/opencv_test/1.jpg')

    gray2 = cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)

    gray = cv2.cvtColor(gray2,cv2.COLOR_RGB2GRAY)

    # Otsu ' s 二值化;

    ret,thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV +cv2.THRESH_OTSU)

    plt.subplot(1,3,1),

    plt.imshow(gray2),

    plt.title('Original')

    plt.subplot(1,3,3),

    plt.imshow(thresh),

    plt.title("Otsu's")

    现在我们的目标就转化为提取图像中上面的白色区域:这里需要记住的是 这里硬币区域的是前景,也就是里硬币中心区域越近前景的可能性越大,离硬币区域中心越远的为背景的可能性越大 ,模糊区域就是前景与背景之间的边缘区域 ;

    提取硬币区域,目前比较有效的有两种操作:腐蚀 操作和 膨胀 操作,腐蚀是用来去除边缘像素,而膨胀操作是将硬币边缘区域向外延申,对于操作之后的区域我们就能确定哪个区域一定是前景( Foreground ),哪个区域一定是背景( Background ).

    代码部分:

    #nosing removoal迭代两次

    kernel = np.ones((3,3),np.uint8)

    opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel,iterations = 2)

    # sure background area

    sure_bg = cv2.dilate(opening,kernel,iterations = 3)

    dist_transform = cv2.distanceTransform(opening,1,5)

    ret,sure_fg = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0)

    sure_fg = np.uint8(sure_fg)

    unknow = cv2.subtract(sure_bg,sure_fg)

    plt.subplot(1,3,1),

    plt.imshow(sure_bg),

    plt.title('Black region\nmust be background')

    plt.subplot(1,3,3),

    plt.imshow(unknow),

    plt.title('Yellos region\nmust be foregroun'),

    确定的背景区域减去一定确定的前景区域就是我们所要的硬币区域 ;分水岭算法在这里应用就是处理前景和背景的交界处,经过区域相减、阈值化处理之后得到肯定是硬币的区域,接下来需要我们创建标签(与源图像大小相同,数据类型为 int32 );

    利用 cv2.connectedComponents() 把不同区域的颜色分为不同颜色,把背景标记为0(也就是代码中的unkbow区域),最后就是进行分水岭算法,把不同的区域赋予不同的颜色

    #Marker labeling

    ret,makers1 = cv2.connectedComponents(sure_fg)

    #Add one to all labels so that sure background is not 0 but 1;

    markers = makers1 +1

    #Now mark the region of unknow with zero;

    markers[unknow ==255] =0

    markers3 = cv2.watershed(img1,markers)

    上面提到,不同区域的边界,在进行分水岭分割算法之后都被赋值为 -1;把区域为 -1 的区域用红色表示,就能非常清楚地看到分界线了:

    img1[markers3 == -1] =[255,0,0]

    plt.subplot(1,3,1),

    plt.imshow(makers1),

    plt.title('makers1')

    plt.subplot(1,3,2),

    plt.imshow(markers3),

    plt.title('markers3')

    plt.subplot(1,3,3),

    plt.imshow(img1),

    plt.title('img1'),

    最后的分割展示效果展示如下:

    这篇文章算是 Opencv_python 系列的第二篇教程,文章种完整代码已经上传到了 Github 上面了,贴一下链接地址:GITHUB;

    个人微信公众号:Z先生点记;专注于 python爬虫,数据分析、可视化;python图像处理方面,没事的话可以常来坐坐!

    展开全文
  • 1个K均值算法实际上,K-means算法是一种非常简单的算法,与算法思想或特定实现无关. 通过以一定方式测量样本之间的相似度,并迭代更新聚类中心,它属于无监督分类. 当聚类中心不再移动或移动差异小于阈值时,将样本...

    zgtxtxxb-21-10-1402-1.jpg

    1个K均值算法

    实际上,K-means算法是一种非常简单的算法,与算法思想或特定实现无关. 通过以一定方式测量样本之间的相似度,并迭代更新聚类中心,它属于无监督分类. 当聚类中心不再移动或移动差异小于阈值时,将样本分为不同的类别.

    1.1算法思想

    随机选择群集中心. 根据当前聚类中心,使用选择的测量方法对所有样本点进行分类,以计算每个类别的样本点的平均值,作为下一次迭代的聚类中心. 当类中心和当前聚类中心之间的距离(例如4中的距离)小于给定的迭代阈值时,迭代结束. 否则,请继续下一次迭代,直到2

    1.2测量方法

    zgtxtxxb-21-10-1402-6.jpg

    根据聚类中心,所有采样点均分为最相似的类别. 这需要有效的巩固,并且平方差是最常用的度量,方法如下

    20191030105954644.png?201993011012

    2应用于图像分割

    我们知道,无论是灰度图像还是RGB彩像,它实际上都是具有灰度值的矩阵. 因此聚类 图像分割,图像数据格式确定图像分割的方向. K-means聚类算法非常简单,非常具体.

    2.1代码

    a482841f022040f88bf0ab1811556caa.jpg

    导入必要的软件包

    import numpy as np

    import random

    损失函数

    def loss_function(present_center, pre_center):

    '''

    损失函数,计算上一次与当前聚类中的差异(像素差的平方和)

    :param present_center: 当前聚类中心

    :param pre_center: 上一次聚类中心

    :return: 损失值

    '''

    present_center = np.array(present_center)

    pre_center = np.array(pre_center)

    return np.sum((present_center - pre_center)**2)

    分类器

    20160921093947943.jpg

    def classifer(intput_signal, center):

    '''

    分类器(通过当前的聚类中心,给输入图像分类)

    :param intput_signal: 输入图像

    :param center: 聚类中心

    :return: 标签矩阵

    '''

    input_row, input_col= intput_signal.shape # 输入图像的尺寸

    pixls_labels = np.zeros((input_row, input_col)) # 储存所有像素标签

    pixl_distance_t = [] # 单个元素与所有聚类中心的距离,临时用

    for i in range(input_row):

    for j in range(input_col):

    # 计算每个像素与所有聚类中心的差平方

    for k in range(len(center)):

    distance_t = np.sum(abs((intput_signal[i, j]).astype(int) - center[k].astype(int))**2)

    pixl_distance_t.append(distance_t)

    # 差异最小则为该类

    pixls_labels[i, j] = int(pixl_distance_t.index(min(pixl_distance_t)))

    # 清空该list,为下一个像素点做准备

    pixl_distance_t = []

    return pixls_labels

    基于k均值算法的图像分割

    def k_means(input_signal, center_num, threshold):

    '''

    基于k-means算法的图像分割(适用于灰度图)

    :param input_signal: 输入图像

    :param center_num: 聚类中心数目

    :param threshold: 迭代阈值

    :return:

    '''

    input_signal_cp = np.copy(input_signal) # 输入信号的副本

    input_row, input_col = input_signal_cp.shape # 输入图像的尺寸

    pixls_labels = np.zeros((input_row, input_col)) # 储存所有像素标签

    # 随机初始聚类中心行标与列标

    initial_center_row_num = [i for i in range(input_row)]

    random.shuffle(initial_center_row_num)

    initial_center_row_num = initial_center_row_num[:center_num]

    initial_center_col_num = [i for i in range(input_col)]

    random.shuffle(initial_center_col_num)

    initial_center_col_num = initial_center_col_num[:center_num]

    # 当前的聚类中心

    present_center = []

    for i in range(center_num):

    present_center.append(input_signal_cp[initial_center_row_num[i], initial_center_row_num[i]])

    pixls_labels = classifer(input_signal_cp, present_center)

    num = 0 # 用于记录迭代次数

    while True:

    pre_centet = present_center.copy() # 储存前一次的聚类中心

    # 计算当前聚类中心

    for n in range(center_num):

    temp = np.where(pixls_labels == n)

    present_center[n] = sum(input_signal_cp[temp].astype(int)) / len(input_signal_cp[temp])

    # 根据当前聚类中心分类

    pixls_labels = classifer(input_signal_cp, present_center)

    # 计算上一次聚类中心与当前聚类中心的差异

    loss = loss_function(present_center, pre_centet)

    num = num + 1

    print("Step:"+ str(num) + " Loss:" + str(loss))

    # 当损失小于迭代阈值时,结束迭代

    if loss <= threshold:

    break

    return pixls_labels

    3分类效果

    20191030105730033.jpg?2019930105745

    904258-20160310200608413-127189012.png

    聚类中心数= 3,迭代阈值= 1 = 1

    20191030105753019.jpg?2019930105832

    聚类中心数= 3,迭代阈值= 1 = 1

    4个GitHub

    点击我

    以上是本文的全部内容聚类 图像分割,希望对大家的学习有所帮助,并希望您支持脚本编写室.

    本文来自电脑杂谈,转载请注明本文网址:

    http://www.pc-fly.com/a/jisuanjixue/article-184687-1.html

    展开全文
  • 几种几种图像分割算法python实现,主要包括利用snake模型、小波变换、遗传算法的图像分割算法,包括图例和源代码
  • 目前有很多图像分割方法,其中分水岭算法是一种基于区域的图像分割算法,分水岭算法因实现方便,已经在医疗图像,模式识别等领域得到了广泛的应用。传统分水岭算法基本原理分水岭比较经典的计算方法是L.Vincent于...
  • Python图像分割程序.rar

    2019-11-28 17:00:14
    Python图像分割程序.rar,图像形态学处理,image segmentation。分水岭算法,Garbor算子。
  • 前面一篇文章介绍了图像分类知识,包括常见的图像分类算法,并介绍Python环境下的贝叶斯图像分类算法、基于KNN算法图像分类和基于神经网络算法图像分类等案例。这篇文章将详细讲解图像分割知识,包括阈值分割、...
  • 基于Opencv,使用python语言,以图割算法实现的图像分割
  • python图像分割

    千次阅读 2019-06-11 15:25:43
    1、图像分割原理   图像分割(image segmentation)技术是计算机视觉领域的个重要的研究方向,是图像语义理解的重要一环。图像分割是指将图像分成若干具有相似性质的区域的过程,从数学角度来看,图像分割是将图像...
  • 基于OpenCV-Python图像分割技术的设计和应用杭州市职业病防治院周宇【摘要】【摘要】在图像处理中,图像关键信息的自动化分割提取有着重要的意义。在OpenCV环境下,通过对图像设定HSV阀值,生成前期掩图,然后通过...
  • OTSU图像分割算法使用【最大类间方差】作为标准,利用图像直方图的分布信息,计算出一个阈值,根据像素是否超过阈值将图像分为前景与背景。 (而实际上只是分割亮部与暗部而已,这种简单粗暴的单阈值分割无法真正...
  • python 图像分割Stuck behind the paywall? Click here to read the full article with my friend link. 卡在收费墙后面? 单击 此处 以阅读完整的文章以及我的朋友链接。 Welcome back! 欢迎回来! This is the ...
  • 我们将学习使用分水岭算法实现基于标记的图像分割 我们将看到:cv.watershed() 理论 任何灰度图像都可以看作是一个地形表面,其中高强度表示山峰,低强度表示山谷。你开始用不同颜色的水(标签)填充每个孤立的山谷...
  • python 图像分割

    千次阅读 2018-12-22 20:48:34
    系列文章:图像分割之(一)概述 https://blog.csdn.net/zouxy09/article/details/8532106 计算机视觉、机器学习相关领域论文和源代码大集合 ... 回顾图像分割的经典算法 https://blog.csdn.net/xiangz_csdn/a...
  • 图像分割算法实现(matlab/python

    千次阅读 2019-10-21 19:50:57
    1.最大类间方差法:根据直方图以某一会灰度为阈值将图像分割成两部分,计算两组的方差,当被分成的两组之间的方差最大时,这个灰度为阈值灰度值。(基于阈值分割) img = imread('1.jpg');%原图 I_gray=rgb2...
  • python 图像分割方法总结

    千次阅读 2020-07-01 23:17:21
    本文在这里仅讨论传统的图像分割算法,可供学习和使用。 1、阈值分割 最简单的图像分割算法,只直接按照像素值进行分割,虽然简单,但是在一些像素差别较大的场景中表现不错,是一种简单而且稳定的算法。 def ...
  • 任何一副灰度图像都可以被看成拓扑平面,灰度值高的区域可以被看成是 山峰,灰度值低的区域可以被...我们构建好的堤坝就是对图像分割。这就是分水岭算法的背后哲理。 但是这种方法通常都会得到过度分割的结果,这...
  • 蛇形分割算法+python

    2018-04-12 16:06:45
    蛇形分割算法+python,能对图片进行较好的分割,压缩内含有示例图
  • 图像分割:利用图像的灰度、颜色、纹理、形状等特征,把图像分成若 干个互不重叠的区域,并使这些特征在同一区域内呈现相似性,在不同的区 域之间存在明显的差异性。然后就可以将分割图像中具有独特性质的区域 ...
  • OpenCV—Python 分水岭算法图像分割

    千次阅读 2019-08-28 14:33:53
    分水岭算法是一种图像区域分割法,在分割的过程中,它会把跟临近像素间的相似性作为重要的参考依据,从而将在空间位置上相近并且灰度值相近的像素点互相连接起来构成一个封闭的轮廓,封闭性是分水岭算法的一个重要...
  • Python之opencv 分水岭分割算法

    千次阅读 多人点赞 2017-07-17 17:16:53
    分水岭分割算法 分水岭分割算法的定义网上随便百度一下就可以知道了,我就说一下我的理解,有不对的希望大家也可以帮忙指正。 对于分水岭分割,我的理解是,一幅图像是由不同大小的灰度级像素值构成的,可以把不同...
  • FLICM图像分割算法

    2020-10-10 14:28:30
    FLICM 算法,是一种基于局部空间信息模糊聚类的鲁棒图像分割算法,来自论文"A Robust Fuzzy Local Information C-Means Clustering Algorithm", IEEE Transactions on Image Processing 19(5) 2010 1328-1337, doi: ...
  • 版权声明:本文为博主原创文章...最近做了一个医学息肉图像分割,用到了传统算法中的形态学部分算法,下面是一个demo版,图像就不贴了,看看代码。 # -*- coding:utf-8 -*- # Author: Agent Xu import cv2 impor...
  • 注意:以下img自己加载即可,我是事先把图片转换成了单通道的Array形式,并且我的img是归一化后在0-1的。 import cv2 import numpy as np import copy imgc = copy.deepcopy(img) gray = copy.deepcopy(img) ret, ...
  • 使用分水岭算法使用基于标记的图像分割 函数:cv.watershed() 理论 任何灰度图像都可以看作是地形表面,其中高强度表示峰和丘陵,而低强度表示山谷。你开始用不同颜色的水(标签)填充每个孤立的山谷(局部最小值)...
  • 图像分割算法

    2018-08-15 15:05:26
    自适应灰度阈值进行图像分割,比直接进行二值化效果要好,Matlab2014a平台。
  • otsu图像分割算法

    2011-02-27 11:03:03
    otsu图像分割算法 ,最大类间方差分割算法,十分有用
  • opencv python 图像分割

    2021-02-25 16:40:57
    三、将黑色部分分割出来 代码: from PIL import Image from PIL import ImageEnhance import cv2 from cv2 import dnn_superres import matplotlib.pylab as plt import numpy as np image = Imag..

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,991
精华内容 10,396
关键字:

python图像分割算法

python 订阅