到目前为止,我们使用的大多数技术都要求我们通过其特征手动分割图像。

但是我们实际上可以使用无监督的聚类算法为我们完成此任务。在本文中,我们将讨论如何做到这一点。

让我们开始吧!

导入所需的Python库

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import colors
from skimage.color import rgb2gray, rgb2hsv, hsv2rgb
from skimage.io import imread, imshow
from sklearn.cluster import KMeans

太好了,让我们现在导入将要使用的图像。

dog = imread('beach_doggo.PNG')
plt.figure(num=None, figsize=(8, 6), dpi=80)
imshow(dog);

我们知道,图像本质上是一个三维矩阵,每个像素包含一个红、绿、蓝通道的值。但实际上,我们可以使用备受喜爱的Pandas库将每个像素存储为单独的数据点。下面的代码就是这样做的。

def image_to_pandas(image):df = pd.DataFrame([image[:,:,0].flatten(),image[:,:,1].flatten(),image[:,:,2].flatten()]).Tdf.columns = [‘Red_Channel’,’Green_Channel’,’Blue_Channel’]return df
df_doggo = image_to_pandas(dog)
df_doggo.head(5)

这使得图像的操作更加简单,因为更容易将其视为可以输入到机器学习算法中的数据。

在我们的实例中,我们将使用K-means算法对图像进行聚类。

plt.figure(num=None, figsize=(8, 6), dpi=80)
kmeans = KMeans(n_clusters=  4, random_state = 42).fit(df_doggo)
result = kmeans.labels_.reshape(dog.shape[0],dog.shape[1])
imshow(result, cmap='viridis')
plt.show()

如我们所见,图像被分为四个不同的区域。让我们分别可视化每个区域。

fig, axes = plt.subplots(2,2, figsize=(12, 12))
for n, ax in enumerate(axes.flatten()):ax.imshow(result==[n], cmap='gray');ax.set_axis_off()fig.tight_layout()

该算法根据R,G和B像素值分割图像。当然,一个缺点是这是一种完全不受监督的学习算法。它并不特别关心任何特定群集背后的含义。作为证据,我们可以看到第二和第四簇都具有狗的突出部分(阴影部分和未阴影部分)。也许运行4个集群过多,让我们重试集群,但将集群数设置为3。

太好了,我们可以看到狗是一个整体。现在让我们看看如果将每个聚类作为单独的蒙版应用于图像会发生什么。

fig, axes = plt.subplots(1,3, figsize=(15, 12))
for n, ax in enumerate(axes.flatten()):dog = imread('beach_doggo.png')dog[:, :, 0] = dog[:, :, 0]*(result==[n])dog[:, :, 1] = dog[:, :, 1]*(result==[n])dog[:, :, 2] = dog[:, :, 2]*(result==[n])ax.imshow(dog);ax.set_axis_off()
fig.tight_layout()

我们可以看到,该算法生成了三个不同的簇,即沙子,生物和天空。当然,算法本身对这些簇并不十分在意,只是它们共享相似的RGB值。要由人类来解释这些簇。

在我们离开之前,我认为如果简单地将其绘制在3D图形上,则对实际显示我们的图像会有所帮助。

def pixel_plotter(df):x_3d = df['Red_Channel']y_3d = df['Green_Channel']z_3d = df['Blue_Channel']color_list = list(zip(df['Red_Channel'].to_list(),df['Blue_Channel'].to_list(),df['Green_Channel'].to_list()))norm = colors.Normalize(vmin=0,vmax=1.)norm.autoscale(color_list)p_color = norm(color_list).tolist()fig = plt.figure(figsize=(12,10))ax_3d = plt.axes(projection='3d')ax_3d.scatter3D(xs = x_3d, ys =  y_3d, zs = z_3d, c = p_color, alpha = 0.55);ax_3d.set_xlim3d(0, x_3d.max())ax_3d.set_ylim3d(0, y_3d.max())ax_3d.set_zlim3d(0, z_3d.max())ax_3d.invert_zaxis()ax_3d.view_init(-165, 60)
pixel_plotter(df_doggo)

我们应该记住,这实际上是算法定义“紧密度”的方式。如果我们将K-Means算法应用于该图,则其分割图像的方式将变得非常清晰。

df_doggo['cluster'] = result.flatten()
def pixel_plotter_clusters(df):x_3d = df['Red_Channel']y_3d = df['Green_Channel']z_3d = df['Blue_Channel']fig = plt.figure(figsize=(12,10))ax_3d = plt.axes(projection='3d')ax_3d.scatter3D(xs = x_3d, ys =  y_3d, zs = z_3d, c = df['cluster'], alpha = 0.55);ax_3d.set_xlim3d(0, x_3d.max())ax_3d.set_ylim3d(0, y_3d.max())ax_3d.set_zlim3d(0, z_3d.max())ax_3d.invert_zaxis()ax_3d.view_init(-165, 60)
pixel_plotter_clusters(df_doggo)

结论

K-Means算法是一种流行的无监督学习算法,任何数据科学家都可以轻松使用它。虽然它很简单,但对于像素差异非常明显的图像来说,它的功能非常强大。在以后的文章中,我们将介绍其他机器学习算法,我们可以用于图像分割以及微调超参数。但现在,我希望你可以在自己的任务中使用这种方法。

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 mthler」,每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓

使用Python进行图像处理—图像分割的无监督学习相关推荐

  1. [Python数据分析] 6-挖掘建模(无监督学习)

    # III.无监督学习编码实现(聚类和关联) # 1.数据集的设定 import numpy as np import matplotlib.pyplot as plt import scipy.st ...

  2. 无监督学习-案例分析:利率期限结构

    目标和背景 目标:使用主成分分析来挖掘美国国债利率期限结构数据的特征. 数据:一共有 236 条记录,对应 236 个月份,每条记录是一个 8 维向量. 解决方案和程序 a. 对所有利率曲线和利率曲线 ...

  3. Python 无监督学习实用指南:1~5

    原文:Hands-on unsupervised learning with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 深度学习 译文集],采用译后编 ...

  4. 易百教程人工智能python修正-人工智能无监督学习(聚类)

    无监督机器学习算法没有任何监督者提供任何指导. 这就是为什么它们与真正的人工智能紧密结合的原因. 在无人监督的学习中,没有正确的答案,也没有监督者指导. 算法需要发现用于学习的有趣数据模式. 什么是聚 ...

  5. [Python人工智能] 十五.无监督学习Autoencoder原理及聚类可视化案例详解

    从本专栏开始,作者正式研究Python深度学习.神经网络及人工智能相关知识.前一篇文章详细讲解了循环神经网络LSTM RNN如何实现回归预测,通过sin曲线拟合实现如下图所示效果.本篇文章将分享无监督 ...

  6. python学了没有用_如何用Python进行无监督学习

    无监督学习是一种用于在数据中查找模式的机器学习技术.无监督算法给出的数据不带标记,只给出输入变量(X),没有相应的输出变量.在无监督学习中,算法自己去发现数据中有趣的结构. 人工智能研究总监严乐群解释 ...

  7. Python机器学习基础篇三《无监督学习与预处理》

    前言 前期回顾: Python机器学习基础篇二<为什么用Python进行机器学习> 上面这篇里面写了文本和序列相关. 我们要讨论的第二种机器学习算法是无监督学习算法.无监督学习包括没有已知 ...

  8. 无监督学习-关联分析apriori原理与python代码

    关联分析是一种无监督学习,它的目标就是从大数据中找出那些经常一起出现的东西,不管是商品还是其他什么 item,然后靠这些结果总结出关联规则以用于后续的商业目的或者其他项目需求. 关联分析原理 那么这里 ...

  9. Python 机器学习实战 —— 无监督学习(下)

    前言 在上篇< Python 机器学习实战 -- 无监督学习(上)>介绍了数据集变换中最常见的 PCA 主成分分析.NMF 非负矩阵分解等无监督模型,举例说明使用使用非监督模型对多维度特征 ...

最新文章

  1. usaco Ordered Fractions 顺序的分数(两种解法)
  2. R语言ggplot2可视化基本散点图(设置X轴使用对数坐标)、并把成对的数据点用线条(line)连接起来、自定义配置线条颜色(Connecting Paired Points with lines)
  3. 在.NET Core程序中设置全局异常处理
  4. 征文通知 | 2018年全国知识图谱与语义计算大会
  5. go io.reader 多次读取_你应该掌握的 Go 高级并发模式:计时器
  6. AngularJS第六课(路由)
  7. 银行招聘考试面试心得
  8. The 2021 ICPC Asia Regionals Online Contest (I)
  9. Oracle用户可要顶住了:准备好大规模补丁工作!以修补多达 433 个的新安全漏洞...
  10. 适用于Chrome类浏览器的喜马拉雅音频下载插件
  11. 人体存在雷达传感器,毫米波雷达技术探测应用,智能感知静态人体存在
  12. Google产品设计师:从二维界面到虚拟现实
  13. 天使轮,种子,A轮,B轮,C轮,Pre-IPO
  14. 应用计算机怎么弹ink,Win10不小心按W键结果弹出INK工作区的处理方法
  15. 关于树叶的活动设计_大班游戏活动《有趣的叶子》教案
  16. 《人性的弱点》良句收录和读后感想
  17. Vue.directive()的用法和实例
  18. H5+CSS初级试题
  19. legacy引导gpt分区_legacy支持gpt吗
  20. IT十年人生过客2-毕业季

热门文章

  1. The Foundry Nuke 14win软件安装包下载Nuke14win安装教程
  2. 最优化方法(运筹学方法)
  3. Android 录音机小米商业项目开源代码 AudioRecord录音暂停 播放 Wav格式(音频二)
  4. Flutter学习笔记(一)
  5. 蒸汽平台进dota2显示连接不上服务器,关于DOTA2接入蒸汽平台的常见问题
  6. 世界排名第一杀毒软件BitDefender
  7. AVG杀毒软件成功卸载
  8. 针对此次iTunes12.1升级导致第三方用不了的解决方案
  9. 【考研英语】态度题/情感词汇
  10. 精益生产中APS的应用