热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

sklearn中的KMeans实现对图像的简单的分割各个代码的详解和分析

实验目的目标︰利用K-means聚类算法对图像像素点颜色进行聚类实现简单的图像分割输出∶同一聚类中的点使用相同颜色标记,不同聚类颜色不同函数详解获取图片的函数

实验目的


  • 目标︰利用K-means聚类算法对图像像素点颜色进行聚类实现简单的图像分割
  • 输出∶同一聚类中的点使用相同颜色标记,不同聚类颜色不同

函数详解


获取图片的函数

def loadData(filePath):data = []img = image.open(f)m,n = img.sizefor 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])return np.mat(data),m,n

  • image是PIL的Image类,调用open方法打开对应路径的文件,生成为image的对象
    • 关于PIL,有一个微博写的不错传送
  • getpixel((x,y)):图片读进来是一个二维矩阵,每一个点是三个值(R,G,B)
  • image对象的size属性:返回的是一个元组,像素构成的矩阵的长宽,(width,height)

具体的图像处理

label = KMeans(n_clusters=4).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-bull-4.jpg","JPEG")

  • KMeans(n_clusters=4).fit_predict(imgData):
    • fit_predict():计算每一个簇的中心并预测每一个点的是属于哪个簇的,返回的与输入数组相同大小的labels数组,标记了每一个数据所属的簇
  • label = label.reshape([row,col]):将由标记组成的数组进行的变形和转换,形成和原图一样大小的数组
  • pic_new = image.new(“L”,(row,col)):根据给定的大小和模式,创建的一个新的图片
    * PIL.Image.new(mode,size,color):size是对应的一个二维的元组,指定图片的大小
    * mode:这里是指定对应每一个像素点是8个位,0到255之间
    在这里插入图片描述
  • pic_new.putpixel((i,j),int(256/(label[i][j]+1))):将生成的新的像素点放到新生成的矩阵中
    • PIL.Image.eval(image, *args):后续为一个整数
    • int(256/(label[i][j]+1))):将的之转变为的对应的不同的灰度值的图片,防止除数为零,就标记上在加+

最终实现的代码

import numpy as np
import PIL.Image as image
from sklearn.cluster import KMeansdef loadData(filePath):data = []img = image.open(filePath)m,n = img.sizefor 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])return np.mat(data),m,nimgData,row,col = loadData('bull.jpg')
label = KMeans(n_clusters=4).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-bull-4.jpg","JPEG")


推荐阅读
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • 利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Exce ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • Python 序列图分割与可视化编程入门教程
    本文介绍了如何使用 Python 进行序列图的快速分割与可视化。通过一个实际案例,详细展示了从需求分析到代码实现的全过程。具体包括如何读取序列图数据、应用分割算法以及利用可视化库生成直观的图表,帮助非编程背景的用户也能轻松上手。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 使用多项式拟合分析淘宝双11销售趋势
    根据天猫官方数据,2019年双11成交额达到2684亿元,再次刷新历史记录。本文通过多项式拟合方法,分析并预测未来几年的销售趋势。 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 开发日志:高效图片压缩与上传技术解析 ... [详细]
  • 本文详细解析了客户端与服务器之间的交互过程,重点介绍了Socket通信机制。IP地址由32位的4个8位二进制数组成,分为网络地址和主机地址两部分。通过使用 `ipconfig /all` 命令,用户可以查看详细的IP配置信息。此外,文章还介绍了如何使用 `ping` 命令测试网络连通性,例如 `ping 127.0.0.1` 可以检测本机网络是否正常。这些技术细节对于理解网络通信的基本原理具有重要意义。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • Python多线程编程技巧与实战应用详解 ... [详细]
  • 本文探讨了一种高效的算法,用于生成所有数字(0-9)的六位组合,允许重复使用数字,并确保这些组合的和等于给定的整数N。该算法通过优化搜索策略,显著提高了计算效率,适用于大规模数据处理和组合优化问题。 ... [详细]
  • Python全局解释器锁(GIL)机制详解
    在Python中,线程是操作系统级别的原生线程。为了确保多线程环境下的内存安全,Python虚拟机引入了全局解释器锁(Global Interpreter Lock,简称GIL)。GIL是一种互斥锁,用于保护对解释器状态的访问,防止多个线程同时执行字节码。尽管GIL有助于简化内存管理,但它也限制了多核处理器上多线程程序的并行性能。本文将深入探讨GIL的工作原理及其对Python多线程编程的影响。 ... [详细]
author-avatar
皮蓬
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有