# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
import cv2
"""
k-mean聚类图像分割算法
1. 这里FCM 模糊聚类也是相似的,只是将硬分类变成隶属函数;
2. 但无论是K-mean还是FCM 隶属函数都很麻烦,这里用的是灰度值,
基本也就等价于一种自适应的基于阈值的图像分割了
第一步. 随机设定一个分类, 初始化C个灰度值
第二步. 计算图像中所有像素与这个分类的关系,进行分类;
第三步. 将分类后的像素灰度均值作为新的分类
第四步. 迭代上述三步,直到新的分类点与老的分类点满足收敛要求
"""
path = '/XXXXX/'
img = cv2.imread(path + 'lena.jpg')
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
img_gray_array = np.array(img_gray)
img_gray_array = cv2.resize(img_gray_array, (128, 128), interpolation=cv2.INTER_LINEAR)
img_classifier = np.zeros(img_gray_array.shape)
class_num = 3
c_center = np.random.randint(255, size=class_num)
w = img_gray_array.shape[0]
h = img_gray_array.shape[1]
def get_min(c1, c2, c3):
min = c1
if c2 < min:
min = c2
if c3 < min:
min = c3
if c1 == min:
return 0
elif c2 == min:
return 1
else:
return 2
final_dis = 999
threshold_dis = 5
while final_dis > threshold_dis:
#1. 更新分类
for i in range(w):
for j in range(h):
cur_gray = img_gray_array[i][j]
c1_dis = abs(cur_gray - c_center[0])
c2_dis = abs(cur_gray - c_center[1])
c3_dis = abs(cur_gray - c_center[2])
img_classifier[i][j] = get_min(c1_dis, c2_dis, c3_dis)
#2. 计算新的聚类点
c_center_new = np.zeros(c_center.shape);
final_dis = 0
for t in range(class_num):
c_center_new[t] = img_gray_array[np.where(img_classifier == t)].mean()
final_dis += abs(c_center_new[t] - c_center[t])
c_center = c_center_new
#绘制结果
for c in range(class_num):
img_gray_array[np.where(img_classifier == c)] = c_center[c]
plt.imshow(img_gray_array, cmap='gray')
plt.show()
【图像处理5】均值聚类
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.