个人学习笔记:采用聚类方法对图像进行分割,以下内容纯粹个人理解,如有错误请帮我指出!多谢!

图像分割就是把图像按照某些条件分成不同的区域,并提取出感兴趣的区域。传统的分割方法包括基于阈值的分割、基于区域的分割、基于边缘的分割等。当然,本次笔记写的是采用K均值聚类实现图像分割。(代码在文章结尾)

一、理论分析

K均值是一种比较常用的聚类算法,由于并不是本次笔记的重点,因此只进行算法的流程简单记录如下:

1、选取K个样本作为聚类中心

2、计算各个样本到聚类中心的距离

3、更新均值向量,重复以上步骤

分割算法核心:对图像的像素进行聚类,相似RGB值的像素被聚到一起,就形成了K个区域!

问题的核心在于如何使用K均值对图像的像素进行聚类,自己整理了以下的几个问题:

1、 K均值使用什么做样本?

K均值聚类就是把图像的像素点按照“值的接近程度”进行聚类,那么就会给每个像素点打标签(把每个位置R、G、B值看作是一个样本,R、G、B就是三个特征),有多少像素值(R、G、B算一个像素值)就有多少个样本。

2、 K均值得到的标签含义是什么?

K均值得到的结果标签就是width*height个0,1,2这种值,因为图像提供的样本数就是width*height个,也就是对每个位置的像素点打标签。含义就是亮度接近的像素标签值相同。

3、K均值聚类以后如何得到新的聚类图像

像素点的标签值表示它属于哪个类,后续使用标签值作为亮度值。如果是聚类结果为3, 那么标签值就有0,1,2三个,标签的shape是width*height,那么就是用0,1,2填充一张np.zeros(width, height)图像,就得到了最后的聚类结果。

标签值相同的位置因此也就亮度相同,得到的聚类图像仅仅包含k个亮度种类,比如K=3,那么聚类图像就只有三种亮度值

实现代码里面未解决的Bug:因为标签值0,1,2代表的仅仅是三个不同区域,但是没办反设定哪个区域是2(最亮的区域),也就是最后合成的图像哪个区域亮没办反控制(比如人脸区域应该更亮),只能多运行几次程序。

二:代码实现

算法流程分为以下四步:

1、读取图片

2、将图片像素转为样本形式

3、对样本进行聚类

4、创建空白图像

5、使用聚类结果对空白图像进行填充

6、保存聚类得到的标签图

步骤1和2:

# 1:read image

上述代码块的#1负责读取图片,#2负责把(w,h,3)的图像转为(w*h,3)的数据,每行就是一个样本,每个样本包含R、G、B三个特征值。

步骤3:

    # 3: cluster, I thought: give every pixel (that in orignal image)#    a label , so the label have same shape as image(gray)cls = KMeans(n_clusters=k_cluster).fit_predict(data)cls = cls.reshape(image.shape[0], image.shape[1])

聚类就是对上述的像素值进行聚类

步骤4:

    # 4: create a image containercontainer = np.zeros(shape=(image.shape[0], image.shape[1]))

创建的像素值全为0的空白图像,用于存储聚类标签。

步骤5:

    # 5: use cluster labels as "gray value" #    and  fill it into aimage containerfor i in range(image.shape[0]):for j in range(image.shape[1]):# cls[i, j]*30 ,because label value is 0, 1, 2# the bright difference betwwen labels is to smallcontainer[i, j] = cls[i, j]*60

将聚类标签值cls[i, j]乘以60作为亮度值(乘以70或者任何值都行,只要保证K*任何值不超过255)

步骤6:

    # 6: saver the cluster imagecontainer = container.astype(np.uint8) imageio.imsave(save_name, container)

保存的时候一定要转换为uint8编码

完整的代码如下:

import numpy as np
import imageio
from sklearn.cluster import KMeansdef image_cluster(image_name, save_name, k_cluster=3):"""cluster by KMeans for RGB image"""# 1:read imageimage = imageio.imread(image_name)# 2: convert (w, h, 3) into (w*h, 3)# R,G and B combine as 3 features # data will be a 2D matrix, each row have 3 values(R/G/B),# and each column has width*height values# this operation convert 3D to 2D, like reshape image2matrix = []for i in range(image.shape[0]):for j in range(image.shape[1]):r_v, g_v, b_v = image[i, j]image2matrix.append([r_v/255.0, g_v/255.0, b_v/255.0])data = np.mat(image2matrix)# 3: cluster, I thought: give every pixel (that in orignal image)#    a label , so the label have same shape as image(gray)cls = KMeans(n_clusters=k_cluster).fit_predict(data)cls = cls.reshape(image.shape[0], image.shape[1])# 4: create a image containercontainer = np.zeros(shape=(image.shape[0], image.shape[1]))# 5: use cluster labels as "gray value" #    and  fill it into aimage containerfor i in range(image.shape[0]):for j in range(image.shape[1]):# cls[i, j]*30 ,because label value is 0, 1, 2# the bright difference betwwen labels is to smallcontainer[i, j] = cls[i, j]*60# 6: saver the cluster imagecontainer = container.astype(np.uint8) imageio.imsave(save_name, container)return Trueimage_cluster("data/vivian.jpg", "results/cluster.jpg")

对标题上费雯丽的照片进行聚类结果如下:

个人认为:K如果选择为2,那么图片视觉上看就应该包含“2种”明显不同的区域;K如果选择为3,那么图片中就应该包含3种明显不同的区域。

matlab对图像进行均值滤波_用K均值进行图像分割相关推荐

  1. k均值算法 二分k均值算法_使用K均值对加勒比珊瑚礁进行分类

    k均值算法 二分k均值算法 Have you ever seen a Caribbean reef? Well if you haven't, prepare yourself. 您见过加勒比礁吗? ...

  2. matlab 均值滤波_数字图像处理基础 — 高斯滤波

    高斯滤波,本文主要讲其如何通过C语言实现.不太擅长写理论性质的文章,这里仅仅阐述自己怎么实现以及简单的优化过程. 通常我们对获取的图像进行进一步处理时,往往需要先进行一次降噪,而通常我们选择的是高斯滤 ...

  3. matlab实现频域率滤波,基于Matlab的图像的频域滤波实现及研究.doc

    摘要:图像的频域滤波是图像增强的一种方法.图像增强是图像处理的方法之一,有频率域法和空间域法.频率域法把图像看成一种二维信号,对其进行二维傅里叶变换的信号增强,采用低通滤波法可以去掉图像的噪声:采用高 ...

  4. python均值滤波_均值滤波、高斯滤波python实现

    首先编写卷积代码 保证可以实现各种size滤波 def image_convolution(image,kernel): [img_height,img_width] = image.shape [k ...

  5. k均值聚类图像分割matlab代码_用K均值聚类法为人类拍摄的首张黑洞照片进行分割...

    众所周知,人类最近拍摄了首张黑洞照片.网友们纷纷表示,这明明就是一个甜甜圈嘛!以前以为黑洞是这个世界上最最高冷的存在,而此刻突然现出真身,形象却是如此的人畜无害!不但如此,还勾起了网友的食欲!简直是罪 ...

  6. 将图像转为特征值_用K均值进行图像分割

    个人学习笔记:采用聚类方法对图像进行分割,以下内容纯粹个人理解,如有错误请帮我指出!多谢! 图像分割就是把图像按照某些条件分成不同的区域,并提取出感兴趣的区域.传统的分割方法包括基于阈值的分割.基于区 ...

  7. python实现均值滤波_python如何实现均值滤波?

    均值滤波:典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代 ...

  8. python均值滤波_opencv+python实现均值滤波

    本文实例为大家分享了opencv+python实现均值滤波的具体代码,供大家参考,具体内容如下 原理 均值滤波其实就是对目标像素及周边像素取平均值后再填回目标像素来实现滤波目的的方法,当滤波核的大小是 ...

  9. MATLAB3*3均值滤波、5*5均值滤波和圆盘滤波

    clc,clear,close all % 清理命令区.清理工作区.关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 im = imread('co ...

最新文章

  1. JMeter学习(二十三)关联
  2. Leangoo敏捷项目管理软件做多团队大规模敏捷
  3. 500 OOPS:cannot change directory:/root 问题
  4. boost::mp11::mp_transform_third相关用法的测试程序
  5. promise中调用ajax
  6. JDK源码 - BitSet的实现
  7. JAVA入门级教学之(super关键字)
  8. java解析shell命令_Android中执行java命令的方法及java代码执行并解析shell命令
  9. 我儿子竟跟男孩子抱在一起
  10. spring5.0学习笔记10
  11. Win10安装Centos7双系统
  12. 桥接、交换机、路由器、网桥、网关
  13. 新iPhoneSE定价较低,置国产旗舰手机于尴尬境地!
  14. 从ChargePoint到能链智电,充电服务商的价值创新
  15. MAC上Chrome浏览器没有声音
  16. 「订单」业务的设计与实现
  17. 一个电视剧男孩计算机专业的,杨紫新剧化身计算机天才,男主颜值爆表,又是一部爆款剧!...
  18. JDK版本不兼容问题
  19. 11 《痛苦与狂喜:米开朗基罗传》-豆瓣评分8.9
  20. 【每日一道智力题】之坤坤猜生日(面试高频)

热门文章

  1. Yii框架特点及测试考虑
  2. 通过配置ssh深刻理解puppet的语法及工作机制
  3. NET内存持续增长问题排查
  4. Unable to simultaneously satisfy constraints.
  5. php发送post请求的三种方法
  6. 交换第六天——HSRP、VRRP、GLBP、SPAN
  7. 实例教程七:在SQLite中使用事务
  8. 简历的正确发音和习惯用法
  9. Soa和Wcf(转)
  10. Session对象的清空