十四、聚类实战——图片压缩

对同一像素点值的像素点归为一类,通过平均值进行取代,从而将图像进行压缩并且保证图像尽可能不失真,关键信息仍保留。

from PIL import Image
import numpy as np
from sklearn.cluster import KMeans
import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3Ddef restore_image(cb, cluster, shape):row, col, dummy = shapeimage = np.empty((row, col, 3))index = 0for r in range(row):for c in range(col):image[r, c] = cb[cluster[index]]index += 1return imagedef show_scatter(a):N = 10print('原始数据:\n', a)density, edges = np.histogramdd(a, bins=[N,N,N], range=[(0,1), (0,1), (0,1)])density /= density.max()x = y = z = np.arange(N)d = np.meshgrid(x, y, z)fig = plt.figure(1, facecolor='w')ax = fig.add_subplot(111, projection='3d')ax.scatter(d[1], d[0], d[2], c='r', s=100*density, marker='o', depthshade=True)ax.set_xlabel(u'红色分量')ax.set_ylabel(u'绿色分量')ax.set_zlabel(u'蓝色分量')plt.title(u'图像颜色三维频数分布', fontsize=20)plt.figure(2, facecolor='w')den = density[density > 0]den = np.sort(den)[::-1]t = np.arange(len(den))plt.plot(t, den, 'r-', t, den, 'go', lw=2)plt.title(u'图像颜色频数分布', fontsize=18)plt.grid(True)plt.show()if __name__ == '__main__':matplotlib.rcParams['font.sans-serif'] = [u'SimHei']matplotlib.rcParams['axes.unicode_minus'] = Falsenum_vq = 256 #256个像素,最后想降维到256个维度im = Image.open('Lena.png')     # flower2.png(200)/lena.png(50)  读取图片image = np.array(im).astype(np.float) / 255 # 将图像数据转化为array类型,方便后续的操作image = image[:, :, :3]#所有行、列、前三个维度,因为png有四个属性,RGBα,alpha为透明度,不需要,只用前三个维度信息即可image_v = image.reshape((-1, 3))#拉伸像素点,行不关心,列为3列===转换为二维数据,每一列均为一个维度的全部数据,RGB变成了3列,每行为一个像素点model = KMeans(num_vq)#通过Kmeans对每一行进行处理,也就是每个像素点进行处理,对每个像素点进行分类,像素点相似度的归类;创建聚类对象#每类都有一个中心像素点,将该中心像素点代替这一类,这里手动传入的是分成256个类别。不管像素点位置,只考虑相似与否是否为一类show_scatter(image_v)#画图N = image_v.shape[0]    # 图像像素总数# 选择足够多的样本(如1000个),计算聚类中心idx = np.random.randint(0, N, size=1000)#从图像中随机选取1000个像素点image_sample = image_v[idx]model.fit(image_sample)#将这1000个像素点去训练模型,聚类结果,从1000个像素点中找到最重要的256个像素点作为中心点c = model.predict(image_v)  # 将图像全部的像素点进行预测,看看图像中的所有像素点离这256个簇哪一个最近,把图像的所有像素点进行分类print('聚类结果:\n', c)print('聚类中心:\n', model.cluster_centers_)plt.figure(figsize=(15, 8), facecolor='w')plt.subplot(121)plt.axis('off')plt.title(u'原始图片', fontsize=18)plt.imshow(image)#plt.savefig('1.png')plt.subplot(122)vq_image = restore_image(model.cluster_centers_, c, image.shape)#聚类中心点、聚类结果、模型图像的形状   作为参数进行恢复图像plt.axis('off')plt.title(u'矢量量化后图片:%d色' % num_vq, fontsize=20)plt.imshow(vq_image)#plt.savefig('2.png')plt.tight_layout()plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

步骤菜单使用css3实现

代码库:http://thecodeplayer.com/walkthrough/css3-breadcrumb-navigation 有兴趣的可以看一下,看完绝对让你大饱眼福。首先截图,看效果看着很酷吧,其实实现起来也不是很难,里边需要用的技术有:box-shadow,计数器&…

【嵌入式系统】STM32串口通信的四种方法(基于RTOS)

目录1、串行通信的基本参数2、轮询方式代码效果3、中断方式代码效果4、中断加上时间戳方式代码及效果5、DMA空闲中断方式接收数据1、串行通信的基本参数 串行端口的通信方式是将字节拆分成一个接一个的位再传输出去,接收方再将此一个一个的位组合成原来的字符&…

大数据 java 代码示例_Java变量类型与示例

大数据 java 代码示例Java变量 (Java variables) Variables are the user-defined names of the memory blocks, and their values can be changed at any time during program execution. They play an important role in a class/program as they help in to store, retrieve…

毕业设计

位置跟踪系统工作原理(博闻网) http://science.bowenwang.com.cn/location-tracking.htm Azuma是这样定义增强现实的 :虚实结合 ,实时交互 ,三维注册 环境搭建: http://cvchina.net/thread-173-1-1.html http://blog.csdn.net/jdh99/article/…

十五、聚类的评估

一、Given Label 均一性homogeneity:一个簇中只包含一个类别样本,Precision 完整性completeness:同类别样本被归到同一个簇中,Recall 将均一性h和完整性c进行结合(二者加权平均)得到V-Measure,,β为权重 …

SQL SERVER作业的Schedules浅析

SQL SERVER作业的计划(Schedules),如果你没仔细研究过或没有应用一些复杂的计划(Schedules),那么你觉得SQL SERVER作业的计划(Schedules)非常好用,也没啥问题,但是我要告诉你一个“残…

leetcode 51. N 皇后 思考分析

目录题目思考AC代码题目 n 皇后问题研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 思考 首先以N4为例,画出解空间树的一部分: 根据模板: void backtracking(参数) {if(终止条件){存放结果…

Django实战(18):提交订单

前面的内容已经基本上涵盖了Django开发的主要方面,我们从需求和界面设计出发,创建模型和修改模型,并通过scaffold作为开发的起点;在scaffold的基础上重新定制模板,并且通过Model类和Form类对用户输入的数据进行校验。我…

No module named ‘tensorflow.examples‘解决方案

想从tensorflow中导入mnist手写数字数据集,结果报错 from tensorflow.examples.tutorials.mnist import input_data import tensorflow.compat.v1 as tf tf.disable_v2_behavior()my_mnist input_data.read_data_sets("MNIST_data_bak/", one_hotTrue)&…

julia example_使用Julia中的Example的sign()函数

julia exampleJulia| sign()函数 (Julia | sign() function) sign() function is a library function in Julia programming language, it returns the sign of the given value in the form of -1/1. sign()函数是Julia编程语言中的库函数,它以-1 / 1的形式返回给…

.NET通用基本权限系统

DEMO下载地址: http://download.csdn.net/detail/shecixiong/5372895 一、开发技术:B/S(.NET C# ) 1、Windows XP以上 (支援最新Win 8) 2、Microsoft Visual Studio 2010/2012 C#.NET 3、.NET Framework 4.0以上 (支援最新4.5版本) 4、SQL Server 2005以…

leetcode 37. 解数独 思考分析

目录题目核心思路的不断细化1、核心框架2、考虑到每个位置的工作3、考虑到到达最后一列、该位置的数已经预置的情况4、判断是否符合规则的函数5、确定递归终止条件确定函数返回值AC代码题目 编写一个程序,通过填充空格来解决数独问题。 一个数独的解法需遵循如下规…

快速完成兼职外包开发任务

做了很多年的开发相关的工作,做过兼职开发,也做过外包一些开发项目。 兼职人员角色时 正是经历这些事情时,每次就要提前很费经的跟公司沟通,让他们把公司内部的svn开发出去,但是就是很难,会涉及到安全各方的…

使用YOLOv5训练NEU-DET数据集

一、下载YOLOv5源码和NEU-DET(钢材表面缺陷)数据集 YOLOv5源码 NEU-DET(钢材表面缺陷)数据集 这里的数据集已经经过处理了,下载即可 若通过其他途径下载的原始数据集标签为xml格式,需要转化为txt格式XML转txt格式脚本 二、数据集准备 NEU-DET(钢材表…

kotlin获取属性_Kotlin程序获取系统MAC地址

kotlin获取属性The task is to get system MAC address. 任务是获取系统MAC地址。 package com.includehelpimport java.net.InetAddressimport java.net.NetworkInterface//Function to get System MACfun getSystemMac(): String? {return try {val OSName System.getProp…

带分页功能的SSH整合,DAO层经典封装

任何一个封装讲究的是,使用,多状态。Action:任何一个Action继承分页有关参数类PageManage,自然考虑的到分页效果,我们必须定义下几个分页的参数。并根据这个参数进行查值。然后在继承ServiceManage,Service…

在windows phone Mango中使用原生代码开发程序

本文不讨论创建可执行的exe程序,主要想说明怎么在silverlight程序里面调用由原生代码所编写的DLL(C / ARM). 原生代码可以调用更多的API,但是这并不是说你就能随意获得那些你没有权限的资源,比如,你可以使用CopyFile这个API,但是如果你试图把文件Copy到\Windows文件夹,就会得到…

leetcode 198. 打家劫舍 思考分析

目录1、题目2、求解思路3、代码1、题目 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动…

找不到Windows照片查看器解决方法

桌面创建一个txt文本 复制这些命令,之后将后缀改为.reg,右击管理员身份运行即可 Windows Registry Editor Version 5.00 ; Change Extensions File Type [HKEY_CURRENT_USER\Software\Classes\.jpg] "PhotoViewer.FileAssoc.Tiff" ; Change E…

数字拆分为斐波那契数列_检查数字是否为斐波那契

数字拆分为斐波那契数列Description: 描述: We are often used to generate Fibonacci numbers. But in this article, we are going to learn about how to search Fibonacci numbers in an array? 我们经常被用来产生斐波那契数。 但是在本文中,我们…