k-means的基本原理较为清晰,这里不多赘述,本次博客主要通过基础的k means算法进行图像的压缩处理。

原理分析

在彩色图像中,每个像素的大小为3字节(RGB),可以表示的颜色总数为256 * 256 * 256。从网上下了一张经典的图像压缩图片作为处理图片原图如下:

所谓通过k-means压缩图片,其实就是将图片所有的像素点聚为指定k类,然后k-means得到的聚类中心与每个像素点所对应类的记录就成了压缩的结果,实际编程中可以用numpy.save将其存储。

  img = np.array(Image.open(file))row = img.shape[0]colum = img.shape[1]point = img.shape[2]pix_num = img.shape[0]*img.shape[1]img = img.reshape(pix_num, point)centroid, clusterAssment = kMeans.kMeans_itnum(img, k, maxiter=maxiter)

这里的kMeans_itum是从《机器学习实战》中稍加修改的函数,使其迭代次数有限,因为如果不设限制,跑图片的kmeans真的很慢,函数具体如下:

    def kMeans_itnum(dataSet, k, distMeas=distEclud, createCent=randCent, maxiter=1):m = shape(dataSet)[0]clusterAssment = mat(zeros((m,2)))#create mat to assign data points #to a centroid, also holds SE of each pointcentroids = createCent(dataSet, k)clusterChanged = Trueiternum = 0while iternum < maxiter:clusterChanged = Falsefor i in range(m):#for each data point assign it to the closest centroidminDist = inf; minIndex = -1for j in range(k):distJI = distMeas(centroids[j,:],dataSet[i,:])if distJI < minDist:minDist = distJI; minIndex = jif clusterAssment[i,0] != minIndex: clusterChanged = TrueclusterAssment[i,:] = minIndex,minDist**2# print centroidsfor cent in range(k):#recalculate centroidsptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]]#get all the point in this clustercentroids[cent,:] = mean(ptsInClust, axis=0) #assign centroid to mean iternum = iternum + 1return centroids, clusterAssment

通过这种方式压缩的图片并不能直接打开,要将其解压缩后查看,具体方法:

  c_img = np.zeros((pix_num, point))for i in range(pix_num):c_img[i, :] = centroid[int(clusterAssment[i, 0]), :]c_img = c_img.reshape(row, colum, point)plt.figure('after')plt.imshow(c_img)plt.axis('off')plt.show()

就是将每个点的像素设置成为其对应的中心点。

结果展示

实话说,用这种方式跑图片实在太慢,刚开始参数设置为k=128 maxiter=200也就是其他博客用的参数,但是跑了很久没跑出来,先退而求其次,取k=10, maxiter=10:

即使参数设置的很弱,但是依旧能大致的看出老虎的轮廓与纹路,但是由于迭代次数和类数k设置的太少,效果不是很好。

然后将参数调整为k=20, maxiter=20

色彩稍微丰富了一些,但依旧颜色失真,之后如果有充足时间试一试更大的参数。

K means 图片压缩相关推荐

  1. python图片压缩算法_使用K均值算法进行图片压缩

    K均值算法 上一期介绍了机器学习中的监督式学习,并用了离散回归与神经网络模型算法来解决手写数字的识别问题.今天我们介绍一种机器学习中的非监督式学习算法--K均值算法. 所谓非监督式学习,是一种与监督式 ...

  2. OpenCV的k - means聚类 -对图片进行颜色量化

    OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...

  3. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

  4. 安卓关于图片压缩的那些事儿,希望给每个安卓开发人员一些帮助

    从事安卓开发也有几年了,本人喜欢开门见山,此篇文章是处理以java语言下的安卓开发过程中图片压缩问题. 图片加载在我们的开发过程中都是一个内存大户,以至于我们加载每一个图片bitmap对象的时候都应该 ...

  5. 【机器学习】K-Means(非监督学习)学习及实例使用其将图片压缩

    非监督学习之k-means K-means通常被称为劳埃德算法,这在数据聚类中是最经典的,也是相对容易理解的模型.算法执行的过程分为4个阶段. 1.从数据中选择k个对象作为初始聚类中心; 2.计算每个 ...

  6. 前端图片压缩上传(纯js的质量压缩,非长宽压缩)

    前端图片压缩上传(纯js的质量压缩,非长宽压缩) 此demo为大于1M对图片进行压缩上传 若小于1M则原图上传,可以根据自己实际需求更改. demo源码如下: <!DOCTYPE html> ...

  7. K-means算法应用:图片压缩

    1. 用K-means算做图片压缩 读取一张示例图片或自己准备的图片,观察图片存放数据特点. 根据图片的分辨率,可适当降低分辨率. 再用k均值聚类算法,将图片中所有的颜色值做聚类. 然后用聚类中心的颜 ...

  8. ruby on rails 之图片压缩

    图片压缩,这个功能基本上每个网站都会去做一下.要不然,就有那样不按套路出牌的人给你去捣乱. 运行环境,同上一篇. 1.papercliper 2.p_w_picpathMagick 同样是paperc ...

  9. python实现图片压缩_python如何实现图片压缩

    本工具是通过将图片上传到第三方网站tinypng,进行压缩后下载,覆盖本地图片,tinypng是一个强大的图片处理网站,目前最可靠的无损压缩网站. 代码如下: import requests from ...

最新文章

  1. window opengl
  2. Android SQLite数据库的详细使用
  3. 连接API:如何将iOS和JSON框架集成
  4. Android 即时通讯开发小结(二)
  5. error2---BeginPath和EndPath之间的TextOut无法显示
  6. js中的bool值转换及 、||、 !!详解
  7. 逆元java_逆元 - 阿聊 - 博客园
  8. N进制正反累加判回文数(洛谷P1015题题解,Java语言描述)
  9. cin gt gt a用c语言怎么写写,cin、cin.get()、cin.getline()、getline()、gets()等函数的用法...
  10. ffmpeg实战教程(二)用SDL播放YUV,并结合ffmpeg实现简易播放器
  11. 苹果高管谈论iPhone 12影像功能:硬件和软件的整体结合
  12. 我的docker随笔26:制作arm平台的python-pandas镜像
  13. ssh服务及安全配置
  14. Maven 手动安装JAR包到本地maven仓库后,但在项目中依旧报错找不到JAR包解决方法
  15. 西门子FB284伺服v90profinet程序西门子触摸屏程序
  16. yii2设置session时间_YII2 设置session过期时间
  17. 备考系统集成项目管理工程师,其实很简单!(干货)
  18. 怎么把ide改成ahci_怎么将IDE硬盘改为AHCI模式
  19. JetBrains Rider 软件使用快速入门
  20. android 相对布局(RelativeLayout)

热门文章

  1. JavaScript节流函数, 防止大量函数触发解决办法
  2. 小技巧!如何把小图拼接成长图,将长图切成小图
  3. 尽人事,听天命,十二轮面试最终圆梦字节,记一次最难面试记录
  4. C语言字符串类基本知识
  5. Git上传文件代码到GitHub
  6. 区块链是否是骗局?它是否有弊端?大神是这样回答的
  7. XP Sp3 开机就要激活,否则无法登录windows桌面
  8. 认识图片放大工具PhotoZoom的菜单栏
  9. RS232/RS485信号转8路模拟信号 隔离D/A转换器WJ33
  10. 八通道IEPE振动传感器数据高速同步网络采集模块 WJ288