基于聚类的“图像分割”实例编写
图像分割 :
利用图像的灰度、颜色、纹理、形状等特征,把图像分成若干个互不重叠的区域,并使这些特征在同一区域内呈现相似性,在不同的区 域之间存在明显的差异性。然后就可以将分割的图像中具有独特性质的区域提取出来用于不同的研究。
图像分割技术已在实际生活中得到广泛的应用
例如:在机车检验领域, 可以应用到轮毂裂纹图像的分割,及时发现裂纹,保证行车安全;在生物医 学工程方面,对肝脏 CT 图像进行分割,为临床治疗和病理学研究提供帮助。
图像分割常用方法 :
阈值分割 : 对图像灰度值进行度量,设置不同类别的阈值,达到分割的目的。
边缘分割 : 对图像边缘进行检测,即检测图像中灰度值发生跳变的地方,则为一片区域的边缘。
直方图法 : 对图像的颜色建立直方图,而直方图的波峰波谷能够表示一块区域的颜色值的范围,来达到分割的目的。
特定理论 : 基于聚类分析、小波变换等理论完成图像分割。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri May 26 18:32:56 2017
@author: xiaolian
"""
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('bull.jpg')
print(imgData, row, col)
label = KMeans(n_clusters = 4).fit_predict(imgData)
label = label.reshape( [row, col] )
print(label)
pic_new = image.new( 'L', (row, col) )
print(pic_new)
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')
* 输出:*