python和机械结合_《Python与机器学习》笔记(8)

无监督学习

1.基于聚类的“图像分割”实例编写

图像分割

图像分割:利用图像的灰度、颜色、纹理、形状等特征,把图像分成若干个互不重叠的区域,并使这些特征在同一区域内呈现相似性,在不同的区域之间存在明显的差异性。 然后就可以将分割的图像中具有独特性质的区域提取出来用于不同的研究。

图像分割技术已在实际生活中得到广泛的应用。例如:在机车检验领域,可以应用到轮毂裂纹图像的分割,及时发现裂纹,保证行车安全;在生物医学工程方面,对肝脏CT图像进行分割,为临床治疗和病理学研究提供帮助。

图像分割常用方法:1. 阈值分割:对图像灰度值进行度量,设置不同类别的阈值,达到分割的目的。

2. 边缘分割:对图像边缘进行检测,即检测图像中灰度值发生跳变的地方,则为一片区域的边缘。

3. 直方图法:对图像的颜色建立直方图,而直方图的波峰波谷能够表示一块区域的颜色值的范围,来达到分割的目的。

4. 特定理论:基于聚类分析、小波变换等理论完成图像分割。

实例描述

目标:利用K-means聚类算法对图像像素点颜色进行聚类实现简单的图像分割

输出:同一聚类中的点使用相同颜色标记,不同聚类颜色不同

技术路线:sklearn.cluster.KMeans

2.“kmeans实现图片分割”实例编写

实验过程

使用算法:Kmeans

实现步骤:建立工程并导入sklearn包

加载图片并进行预处理

加载Kmeans聚类算法

对像素点进行聚类并输出

关于一些相关包的介绍:PIL包:因为本实验涉及图像的加载和创建,因此需要使用到PIL包,如未安装,请下载相关包自行安装。

实验分析

通过设置不同的k值,能够得到不同的聚类结果。同时,k值的不确定也是Kmeans算法的一个缺点。往往为了达到好的实验结果,需要进行多次尝试才能够选取最优的k值。而像层次聚类的算法,就无需指定k值,只要给定限制条件,就能自动地得到类别数k。

本节完整代码:

#!/usr/bin/env python

# _*_ coding: utf-8 _*_

"""@author: antenna@license: (C) Copyright 2019, Antenna.@contact: [email protected]@software:@file: piccut-test.py@time: 2019/4/9 19:38@desc:"""

import numpy as np

import PIL.Image as image

from sklearn.cluster import KMeans

def loadData(filePath):

f = open(filePath, 'rb')

data = []

img = image.open(f)

m, n = img.size

for i in range(m):

for j in range(n):

x, y, z = img.getpixel((i, j))

data.append([x / 256.0, y / 256.0, z / 256.0])

f.close()

return np.mat(data), m, n

imgData, row, col = loadData('kmeans/bull.jpg')

label = KMeans(n_clusters=4).fit_predict(imgData)

label = label.reshape([row, col])

pic_new = image.new("L", (row, col))

for i in range(row):

for j in range(col):

pic_new.putpixel((i, j), int(256 / (label[i][j] + 1)))

pic_new.save("result-bull-4.jpg", "JPEG")

你可能感兴趣的:(python和机械结合)