KMeans整图分割
程序员文章站
2024-03-25 08:14:10
...
图像分割
利用图像的灰度、颜色、纹理、形状等特征,把图像分成若干个互不重叠的区域,并使用这些特征在同一区域内呈现相似性,在不同的区域之间存在明显的差异性。然后就可以将分割的图像中具有独特性质的区域提取出来用于不同的研究。
图像分割技术已在实际生活中得到广泛的应用。例如:在机车检验领域,可以应用到车轱裂纹图像的分割,及时发现裂纹,保证行车安全;在生物医学工程方面,对肝脏CT图像进行分割,为临床治疗和病理学研究提供帮助。
分割方法
- 阈值分割:对图像灰度值进行度量,设置不同类别的阈值,达到分割的目的。
- 区域分割:区域生长和分裂合并法是两种典型的串行区域技术,其分割过程后续步骤的处理要根据前面步骤的结果进行判断而确定。
- 边缘分割:对图像边缘进行检测,即检测图像中灰度值发生跳变的地方,则为一片区域的边缘。
- 直方图法:对图像的颜色建立直方图,而直方图的波峰波谷能够表示一块区域的颜色值的范围,来达到分割的目的。
特定理论
基于聚类分析、模糊集理论、基因编码、小波变换等理论完成图像分割。
相关应用
机器视觉、 人脸识别、指纹识别、交通控制系统、在卫星图像中定位物体(道路、森林等)、行人检测、医学影像、
实例:
目标:利用K-means聚类算法对图像像素点颜色进行聚类实现简单的图像分割
输出:同一聚类中的点使用相同颜色标记,不同聚类颜色不同
# -*- coding: utf-8 -*-
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))#getpixel返回指定位置的像素,如果所打开的图像是多层次的图片,那这个方法就返回一个元组。
data.append([x/256.0 , y/256.0 , z/256.0])#将每个像素归一化成0-1
f.close()
return np.mat(data), m, n#返回矩阵形式的data,以及图片大小
imgData , row ,col = loadData('timg1.jpg')#使用loadData方法处理图片
label = KMeans(n_clusters = 10).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.jpg","JPEG")#保存图片
图片显示:
输出结果: