python实现kmeans图像分割_K-Means 实现图像分割

使用的环境,python3.5,opencv2

函数的格式为:

cv2.kmeans(data, K, bestLabels, criteria, attempts, flags)

'''

参数:

data: 分类数据,最好是np.float32的数据,每个特征放一列。

K: 分类数,opencv2的kmeans分类是需要已知分类数的。

bestLabels:预设的分类标签或者None

criteria:迭代停止的模式选择,这是一个含有三个元素的元组型数。格式为(type, max_iter, epsilon)

其中,type有如下模式:

—–cv2.TERM_CRITERIA_EPS :精确度(误差)满足epsilon停止。

—-cv2.TERM_CRITERIA_MAX_ITER:迭代次数超过max_iter停止。

—-cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,两者合体,任意一个满足结束。

attempts:重复试验kmeans算法次数,将会返回最好的一次结果

flags:初始中心选择,有两种方法:

——v2.KMEANS_PP_CENTERS;

——cv2.KMEANS_RANDOM_CENTERS

返回值:

compactness:紧密度,返回每个点到相应重心的距离的平方和

labels:结果标记,每个成员被标记为0,1等

centers:由聚类的中心组成的数组

'''

灰度图片分割

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

# @Author : matthew

# @Software: PyCharm

import cv2

import matplotlib.pyplot as plt

import numpy as np

def seg_kmeans_gray():

img = cv2.imread('000129.jpg', cv2.IMREAD_GRAYSCALE)

# 展平

img_flat = img.reshape((img.shape[0] * img.shape[1], 1))

img_flat = np.float32(img_flat)

# 迭代参数

criteria = (cv2.TERM_CRITERIA_EPS + cv2.TermCriteria_MAX_ITER, 20, 0.5)

flags = cv2.KMEANS_RANDOM_CENTERS

# 聚类

compactness, labels, centers = cv2.kmeans(img_flat, 2, None, criteria, 10, flags)

# 显示结果

img_output = labels.reshape((img.shape[0], img.shape[1]))

plt.subplot(121), plt.imshow(img, 'gray'), plt.title('input')

plt.subplot(122), plt.imshow(img_output, 'gray'), plt.title('kmeans')

plt.show()

if __name__ == '__main__':

seg_kmeans_gray()

结果:

1366400-20180811183845723-1348679237.png

彩色图片分割

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

# @Author : matthew

# @Software: PyCharm

import cv2

import matplotlib.pyplot as plt

import numpy as np

def seg_kmeans_color():

img = cv2.imread('000129.jpg', cv2.IMREAD_COLOR)

# 变换一下图像通道bgr->rgb,否则很别扭啊

b, g, r = cv2.split(img)

img = cv2.merge([r, g, b])

# 3个通道展平

img_flat = img.reshape((img.shape[0] * img.shape[1], 3))

img_flat = np.float32(img_flat)

# 迭代参数

criteria = (cv2.TERM_CRITERIA_EPS + cv2.TermCriteria_MAX_ITER, 20, 0.5)

flags = cv2.KMEANS_RANDOM_CENTERS

# 聚类

compactness, labels, centers = cv2.kmeans(img_flat, 2, None, criteria, 10, flags)

# 显示结果

img_output = labels.reshape((img.shape[0], img.shape[1]))

plt.subplot(121), plt.imshow(img), plt.title('input')

plt.subplot(122), plt.imshow(img_output, 'gray'), plt.title('kmeans')

plt.show()

if __name__ == '__main__':

seg_kmeans_color()

结果:

1366400-20180811183750242-1504940954.png

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值