Python机器学习案例|梵高的《星空》图片压缩

Python机器学习案例:梵高的《星空》图片压缩

01 案例背景

本案例将奇异值分解用于处理图像压缩任务。要压缩的图片如图所示,是梵高的作品《星空》。
在这里插入图片描述

02 实现代码

Python实现代码如下所示:

 from PIL import Image
 import os
from numpy import *
 import matplotlib as mpl
 import matplotlib.pyplot as plt

 if __name__ == '__main__':
mpl.rcParams['font.sans-serif'] = [u'simHei']
mpl.rcParams['axes.unicode_minus'] = False
A = Image.open('starry_night.jpg')
a = array(A) #转换成矩阵

#由于是彩色图像,所以3通道。a的最内层数组为三个数,分别表示RGB,用来表示一个像素
u_r, sigma_r, v_r = linalg.svd(a[:, :, 0])
u_g, sigma_g, v_g = linalg.svd(a[:, :, 1])
u_b, sigma_b, v_b = linalg.svd(a[:, :, 2])
def restore1(u, sigma, v, k):
 m = len(u)
 n = len(v)
 a = zeros((m, n))
#重构图像
a = dot(u[:, :k], diag(sigma[:k])).dot(v[:k, :])
#上述语句等价于如下形式
#for i in range(k):
# ui = u[:, i].reshape(m, 1)
# vi = v[i].reshape(1, n)
# a += sigma[i] * dot(ui, vi)
a[a < 0] = 0
a[a > 255] = 255
return rint(a).astype('uint8')

plt.figure(facecolor = 'w', figsize = (10, 10))
 #保留的奇异值个数依次为:1,2,...,12
 K = 12
for k in range(1, K + 1):
 print(k)
 R = restore1(u_r, sigma_r, v_r, k)
 G = restore1(u_g, sigma_g, v_g, k)
B = restore1(u_b, sigma_b, v_b, k)
I = stack((R, G, B), axis = 2)
#现实重构后的图片
plt.subplot(3, 4, k)
plt.imshow(I)
plt.axis('off')
plt.title(u'奇异值个数:%d' % k)
plt.suptitle(u'SVD与图像分解', fontsize = 20)
plt.tight_layout(0.1, rect = (0, 0, 1, 0.92))
plt.show()

03 运行结果

运行以上代码的输出结果如图所示。
在这里插入图片描述

到这里这个简单的实力就完成啦!

关于Python的技术储备

在这里给大家分享一些免费的课程供大家学习,下面是课程里面的截图,扫描最下方的二维码就能全部领取,
如果图片失效点击蓝色字体便可跳转哦~点这里哦

1.Python所有方向的学习路线

在这里插入图片描述

2.学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
在这里插入图片描述

3.学习资料

在这里插入图片描述

4.实战资料

实践是检验真理的唯一标准。这里的压缩包可以让你再闲暇之余帮你提升你的个人能力。
在这里插入图片描述

5.视频课程

在这里插入图片描述

好啦今天的分享就到这里结束了,快乐的时光总是短暂呢,想学习更多课程的小伙伴不要着急,有更多惊喜哦~在这里插入图片描述

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 好的,让我们来画一幅星空。我们需要用到 Python 的 matplotlib 库和 numpy 库。 首先,我们导入库: ```python import matplotlib.pyplot as plt import numpy as np ``` 接着,我们创建一个 500x500 的画布,用黑色填充。 ```python fig = plt.figure(figsize=(10, 10)) ax = plt.axes([0, 0, 1, 1]) ax.axis('off') ax.set_xlim(0, 500) ax.set_ylim(0, 500) ax.set_facecolor('black') ``` 然后,我们定义一个函数,用来生成星星的位置和大小。这里我们随机生成 800 个星星,位置和大小都是随机的。 ```python def create_stars(): stars = [] for i in range(800): x = np.random.randint(0, 500) y = np.random.randint(0, 500) size = np.random.randint(1, 5) stars.append((x, y, size)) return stars stars = create_stars() ``` 接下来,我们定义一个函数,用来绘制星星。 ```python def draw_star(star): x, y, size = star color = np.random.choice(['white', 'lightgray', 'yellow']) ax.scatter(x, y, s=size, c=color, alpha=0.8, edgecolors='none') ``` 最后,我们遍历所有的星星,调用 `draw_star()` 函数来绘制它们。 ```python for star in stars: draw_star(star) ``` 现在,我们就完成了星空的绘制。完整代码如下: ```python import matplotlib.pyplot as plt import numpy as np fig = plt.figure(figsize=(10, 10)) ax = plt.axes([0, 0, 1, 1]) ax.axis('off') ax.set_xlim(0, 500) ax.set_ylim(0, 500) ax.set_facecolor('black') def create_stars(): stars = [] for i in range(800): x = np.random.randint(0, 500) y = np.random.randint(0, 500) size = np.random.randint(1, 5) stars.append((x, y, size)) return stars def draw_star(star): x, y, size = star color = np.random.choice(['white', 'lightgray', 'yellow']) ax.scatter(x, y, s=size, c=color, alpha=0.8, edgecolors='none') stars = create_stars() for star in stars: draw_star(star) plt.show() ``` 运行代码,你将会看到一幅美丽的星空。 ### 回答2: 要用Python来画的星空,可以使用Python中的图形库来实现。下面是一种可能的实现方法: 首先需要导入所需的图形库,例如matplotlib和numpy。然后创建一个画布,并设置大小和背景颜色。接下来,利用numpy库中的函数生成随机的星星的坐标,可以使用random模块中的rand函数来生成随机数。生成的星星坐标可以保存在一个数组中。 接着,通过使用matplotlib的scatter函数来绘制星星。可以设置星星的大小,颜色和透明度。可以根据星星的坐标数组来绘制星星。 接下来,需要绘制星空的背景。可以使用matplotlib的imshow函数,并设置相应的参数来绘制背景。可以选择合适的颜色和透明度来表示星空的暗淡和闪耀。 最后,根据的星空作品的特点,可以添加一些额外的绘制效果,例如星星的闪烁效果或者星云的渐变效果。 绘制完成后,保存图片或者显示在屏幕上。 综上所述,使用Python可以通过合适的图形库和函数来绘制的星空。这样的程序可以在Python环境中执行并输出相应的结果。当然,绘制出完美的星空需要艺术感和绘画技巧的结合,这是需要进行实际练习和掌握的。 ### 回答3: 要使用Python绘制的星空图,我们可以使用Python中的绘图库matplotlib和numpy来实现。以下是一个简单的300字中文回答。 首先,我们需要导入所需的库: ```python import numpy as np import matplotlib.pyplot as plt ``` 然后,我们可以创建一个表示画布的空白图像: ```python fig, ax = plt.subplots(figsize=(8, 8)) ``` 接下来,我们可以创建一个表示星空的随机点的numpy数组。我们可以使用numpy的rand函数生成随机数来表示星星的位置和亮度: ```python stars = np.random.rand(1000, 2) # 生成1000个星星的位置 brightness = np.random.rand(1000) # 生成1000个星星的亮度 ``` 然后,我们可以使用散点图来绘制这些星星。星星的大小和亮度可以通过设置参数"s"和"c"来控制: ```python ax.scatter(stars[:, 0], stars[:, 1], s=1000 * brightness, c='white') ``` 接下来,我们可以在画布上绘制一些特殊的元素,例如月亮或山脉。这些元素可以使用matplotlib的其他绘图函数来实现,例如画一个圆来表示月亮: ```python moon = plt.Circle((0.5, 0.5), 0.1, color='gray') ax.add_patch(moon) ``` 最后,我们可以对整个图像进行一些设置,例如设置背景颜色和坐标轴范围: ```python ax.set_facecolor('navy') ax.set_xlim(0, 1) ax.set_ylim(0, 1) ax.axis('off') # 关闭坐标轴显示 ``` 最后,我们可以使用plt.show()函数来显示绘制的图像: ```python plt.show() ``` 通过以上步骤,我们可以使用Python绘制一个简单的星空图。当然,根据具体需求,我们还可以进一步添加其他细节和效果来美化图像。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值