数据分析实战45讲
陈旸
清华大学计算机博士
立即订阅
17314 人已学习
课程目录
已完结 48 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 你为什么需要数据分析能力?
免费
第一模块:数据分析基础篇 (16讲)
01丨数据分析全景图及修炼指南
02丨学习数据挖掘的最佳路径是什么?
03丨Python基础语法:开始你的Python之旅
04丨Python科学计算:用NumPy快速处理数据
05丨Python科学计算:Pandas
06 | 学数据分析要掌握哪些基本概念?
07 | 用户画像:标签化就是数据的抽象能力
08 | 数据采集:如何自动化采集数据?
09丨数据采集:如何用八爪鱼采集微博上的“D&G”评论
10丨Python爬虫:如何自动化下载王祖贤海报?
11 | 数据科学家80%时间都花费在了这些清洗任务上?
免费
12 | 数据集成:这些大号一共20亿粉丝?
13 | 数据变换:考试成绩要求正态分布合理么?
14丨数据可视化:掌握数据领域的万金油技能
15丨一次学会Python数据可视化的10种技能
16丨数据分析基础篇答疑
第二模块:数据分析算法篇 (20讲)
17 丨决策树(上):要不要去打篮球?决策树来告诉你
18丨决策树(中):CART,一棵是回归树,另一棵是分类树
19丨决策树(下):泰坦尼克乘客生存预测
20丨朴素贝叶斯分类(上):如何让机器判断男女?
21丨朴素贝叶斯分类(下):如何对文档进行分类?
22丨SVM(上):如何用一根棍子将蓝红两色球分开?
23丨SVM(下):如何进行乳腺癌检测?
24丨KNN(上):如何根据打斗和接吻次数来划分电影类型?
25丨KNN(下):如何对手写数字进行识别?
26丨K-Means(上):如何给20支亚洲球队做聚类?
27丨K-Means(下):如何使用K-Means对图像进行分割?
28丨EM聚类(上):如何将一份菜等分给两个人?
29丨EM聚类(下):用EM算法对王者荣耀英雄进行划分
30丨关联规则挖掘(上):如何用Apriori发现用户购物规则?
31丨关联规则挖掘(下):导演如何选择演员?
32丨PageRank(上):搞懂Google的PageRank算法
33丨PageRank(下):分析希拉里邮件中的人物关系
34丨AdaBoost(上):如何使用AdaBoost提升分类器性能?
35丨AdaBoost(下):如何使用AdaBoost对房价进行预测?
36丨数据分析算法篇答疑
第三模块:数据分析实战篇 (7讲)
37丨数据采集实战:如何自动化运营微博?
38丨数据可视化实战:如何给毛不易的歌曲做词云展示?
39丨数据挖掘实战(1):信用卡违约率分析
40丨数据挖掘实战(2):信用卡诈骗分析
41丨数据挖掘实战(3):如何对比特币走势进行预测?
42丨当我们谈深度学习的时候,我们都在谈什么?
43丨深度学习(下):如何用Keras搭建深度学习网络做手写数字识别?
第四模块:数据分析工作篇 (2讲)
44丨如何培养你的数据分析思维?
45丨求职简历中没有相关项目经验,怎么办?
加餐 (1讲)
加餐丨在社交网络上刷粉刷量,技术上是如何实现的?
结束语 (1讲)
结束语丨当大家都在讲知识和工具的时候,我更希望你重视思维和实战
数据分析实战45讲
登录|注册

27丨K-Means(下):如何使用K-Means对图像进行分割?

陈旸 2019-02-13
上节课,我讲解了 K-Means 的原理,并且用 K-Means 对 20 支亚洲球队进行了聚类,分成 3 个梯队。今天我们继续用 K-Means 进行聚类的实战。聚类的一个常用场景就是对图像进行分割。
图像分割就是利用图像自身的信息,比如颜色、纹理、形状等特征进行划分,将图像分割成不同的区域,划分出来的每个区域就相当于是对图像中的像素进行了聚类。单个区域内的像素之间的相似度大,不同区域间的像素差异性大。这个特性正好符合聚类的特性,所以你可以把图像分割看成是将图像中的信息进行聚类。当然聚类只是分割图像的一种方式,除了聚类,我们还可以基于图像颜色的阈值进行分割,或者基于图像边缘的信息进行分割等。

将微信开屏封面进行分割

上节课,我讲了 sklearn 工具包中的 K-Means 算法使用,我们现在用 K-Means 算法对微信页面进行分割。微信开屏图如下所示:
我们先设定下聚类的流程,聚类的流程和分类差不多,如图所示:
在准备阶段里,我们需要对数据进行加载。因为处理的是图像信息,我们除了要获取图像数据以外,还需要获取图像的尺寸和通道数,然后基于图像中每个通道的数值进行数据规范化。这里我们需要定义个函数 load_data,来帮我们进行图像加载和数据规范化。代码如下:
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《数据分析实战45讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(14)

  • mickey
    import PIL.Image as image
    导入的是pillow包,而非pil包。
    pil包不支持64位,但是有pillow包代替用。
    2019-02-28
    5
  • 淡魂
    请问老师。自己写Min-Max规范化公式的时候为什么不直接除以255,这样得到的数据也是在[0,1]之间,是因为那个值不可以为0吗?什么原因呢?

    编辑回复: 一个不错的问题,实际上都是一样的,只要能划分到[0,1]空间内,而且在变化的过程中不存在分母为0的情况即可。因为我们是缩放一个固定的尺寸,所以除以255,反变换的时候乘以255是没有问题的。你也可以自己修改运行下,同样可以得到结果。

    2019-02-13
    5
  • cua
    为什么会出现这个错误呢ValueError: too many values to unpack (expected 3)
    2019-02-28
    2
    3
  • vortual
    衷心希望老师能开一讲讲下数据规范化的问题。从之前的几讲总是遇到有些是minmax规范化,有些是需要正态分布,希望老师能讲下具体什么时候用哪种,而且规范化的好处,目前知道的是加快收敛和降低维度,但为啥还不是很清楚
    2019-03-12
    2
  • 深白浅黑
    老师下面函数中,最后的参数代表什么意思?手册上显示的是n_feature,但没说具体的意义,不是很明白。
            c1 = kmeans.cluster_centers_[label[x, y], 2]
            c2 = kmeans.cluster_centers_[label[x, y], 1]
            c3 = kmeans.cluster_centers_[label[x, y], 0]

    编辑回复: 一个很好的问题,实际上label[x,y]是得到当前点的类别,kmeans.cluster_centers_可以得到某类别的数值,因为图像JPG是3个通道,所以通过kmeans.cluster_centers_[label[x, y], 0],kmeans.cluster_centers_[label[x, y], 1],kmeans.cluster_centers_[label[x, y], 2]可以获得这3个通道的数值,然后将这些数值作为当前点的数值。因为当前点已经被划分到了这个类别,所以数值是一致的。这样如果原来图像中有N种颜色,现在聚类数是16,相当于每个点的颜色值就变成了其中一个类别的颜色值,也就是变成了16种颜色,完成了聚类(降维)。

    2019-02-19
    2
  • 王彬成
    新概念总结
    1、图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤

    有一个问题,最后一个案例中,图像分割,输出原图有什么意义
    2019-02-23
    1
  • third
    问题:已经使用mm进行数据拟合转换了,为何还要使用np.mat()转换呢?作用在哪里?方便后面使用np.uint8吗?

    注意:实战的时候,保存图片为jpg格式
    如果是png格式的话,会出现4个值,导致赋值错误,(R, G, B, A)

    import PIL.Image as image
    import numpy as np
    import pandas as pd
    #载入数据
    def load_data(file):
        with open(file,'rb') as f:
            data=[]
            #打开文件
            img=image.open(f)
            width,height=img.size
            #获取特征数据
            for x in range(width):
                for y in range(height):
                    c1,c2,c3=img.getpixel((x,y))
                    data.append([c1,c2,c3])
            #进行mm规范化
            from sklearn.preprocessing import MinMaxScaler
            mm=MinMaxScaler()
            data=mm.fit_transform(data)
            return np.mat(data),width,height
    data,width,height=load_data('./27/baby.jpg')

    #进行聚类
    from sklearn.cluster import KMeans
    kmeans=KMeans(n_clusters=16)
    label=kmeans.fit_predict(data)

    #可视化
    #转换成图像矩阵
    label=label.reshape([width,height])
    #生成一张新图片
    # pic_1=image.new("L",(width,height))
    # #把像素信息写入
    # #方法1写入灰度值
    # for x in range(width):
    # for y in range(height):
    # #按照分类确定灰度值
    # pic_1.putpixel((x,y),int(label[x][y]*256/16))
    # pic_1.save('./27/baby.jpg')

    # #方法2
    # # 使用模组,将表示矩阵转换为各种颜色的矩阵
    # #使用label2rgb(label)*255转化,再把矩阵转化为unit8类型,无符号整数
    # from skimage import color
    # label_color=(color.label2rgb(label)*255).astype(np.uint8)
    # #似乎都需要进行颠倒处理
    # label_color=label_color.transpose(1,0,2)
    # #使用fromarray把矩阵生成图片
    # images=image.fromarray(label_color)
    # images.save('./27/baby_color_2.jpg')

    #方法3获取对应原图
    #创建新的图片
    imges1=image.new('RGB',(width,height))
    #写入图片
    for x in range(width):
        for y in range(height):
            #吧范围为0-255的数值投射到1-256
            #获取第一列即r的值
            c1=kmeans.cluster_centers_[label[x,y],0]
            c2 = kmeans.cluster_centers_[label[x, y], 1]
            c3 = kmeans.cluster_centers_[label[x, y], 2]
            imges1.putpixel((x,y),(int(c1*256)-1,int(c2*256)-1,int(c3*256)-1))
    imges1.save('./27/baby_yasuo.jpg')

    编辑回复: 不用np.mat()也是OK的,jpg和png通道数确实需要注意。

    2019-02-19
    1
  • Ronnyz
    import numpy as np

    import PIL.Image as Image

    from sklearn import preprocessing

    from sklearn.cluster import KMeans

    from skimage import color



    #加载图片,并进行规范化

    def load_data(filepath):

        #读图片

        f=open(filepath,'rb')

        #获取图片像素

        img=Image.open(f)

        #获取图片尺寸和像素矩阵

        width,height =img.size

        data=[]

        for x in range(width):

            for y in range(height):

                #得到点(x,y)的R,G,B通道值

                r,g,b=img.getpixel((x,y))

                data.append([r,g,b])

        f.close()

        #采用min-max规范化

        mm=preprocessing.MinMaxScaler()

        print('原位置列表:')

        print(type(data))

        print(len(data))

        data=mm.fit_transform(data)

        return np.mat(data),width,height



    #加载图片,得到规范化结果

    img,width,height = load_data('./kmeans-master/baby.jpg')

    print('\n规范化的像素矩阵:')

    print(type(img))

    print(img.shape)

    #用K-Means进行16聚类

    kmeans = KMeans(n_clusters=16)

    label=kmeans.fit_predict(img)



    #将图像结果,转化成图像尺寸矩阵

    label=label.reshape([width,height])



    #创建颜色表示矩阵图

    label_color = (color.label2rgb(label)*255).astype(np.uint8)

    label_color=label_color.transpose(1,0,2)

    print('\n像素颜色矩阵:')

    print(label_color.shape)

    images=Image.fromarray(label_color)

    images.save('./kmeans-master/baby_mark.jpg')



    #创建新图像,保存聚类压缩之后的结果

    img=Image.new('RGB',(width,height))

    for x in range(width):

        for y in range(height):

            r1=kmeans.cluster_centers_[label[x, y],0]

            g1=kmeans.cluster_centers_[label[x, y], 1]

            b1=kmeans.cluster_centers_[label[x, y], 2]

            img.putpixel((x,y),(int(r1*256)-1,int(g1*256)-1,int(b1*256)-1))

    img.save('./kmeans-master/baby_new.jpg')

    作者回复: 不错 加油Ronnyz

    2019-11-18
  • 滨滨
    图像分割的主要工作在于数据的预处理,同时分割为几类需要人工指定这个很不方便
    2019-04-05
  • 三硝基甲苯
    一开始对那个baby的图进行16份用Kmeans分类后的颜色感觉到怪怪的,折腾了好久才反应过来,这个是个分类,还好醒悟的早,不然这个要纠结好久,以为自己哪里有问题。。
    2019-03-16
  • 宋晓明
    极客时间 pc界面终于改了。。之前的界面找某篇文章费死个劲
    2019-03-12
  • mickey
    # -*- coding: utf-8 -*-
    # 使用K-means对图像进行聚类,显示分割标识的可视化
    import numpy as np
    import PIL.Image as image
    from sklearn.cluster import KMeans
    from sklearn import preprocessing
    from skimage import color

    # 加载图像,并对数据进行规范化
    def load_data(filePath):
        # 读文件
        f = open(filePath,'rb')
        data = []
        # 得到图像的像素值
        img = image.open(f)
        # 得到图像尺寸
        width, height = img.size
        for x in range(width):
            for y in range(height):
                # 得到点(x,y)的三个通道值
                c1, c2, c3 = img.getpixel((x, y))
                data.append([c1, c2, c3])
        f.close()
        # 采用Min-Max规范化
        mm = preprocessing.MinMaxScaler()
        data = mm.fit_transform(data)
        return np.mat(data), width, height

    # 加载图像,得到规范化的结果img,以及图像尺寸
    img, width, height = load_data('./baby2.jpg')

    # 用K-Means对图像进行16聚类
    kmeans =KMeans(n_clusters=16)
    kmeans.fit(img)
    label = kmeans.predict(img)
    # 将图像聚类结果,转化成图像尺寸的矩阵
    label = label.reshape([width, height])
    # 将聚类标识矩阵转化为不同颜色的矩阵
    label_color = (color.label2rgb(label)*255).astype(np.uint8)
    label_color = label_color.transpose(1,0,2)
    images = image.fromarray(label_color)
    images.save('baby_16.jpg')
    2019-02-28
  • Rickie
    老师好,想请问下您聚类后得到的那张灰度图像有其他的设置吗?我使用跟您一样的代码,最后生成的图尺寸非常小,且一些细节并没有分类正确...不知道是什么原因?

    编辑回复: 可以找运营加到微信群里,我帮你看看。

    2019-02-14
  • 梁利文
    那连接只能在手机上看,在电脑上看不到,不方便看案例和操作
    2019-02-14
收起评论
14
返回
顶部