import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from PIL import Image compress_rate = 0.2 def get_color(number): img = Image.open("../imgs/test/{}.jpg".format(number)) img.thumbnail((int(img.width*compress_rate), int(img.height * compress_rate))) img_data = np.array(img).reshape(-1, 3) print(img_data.shape) def arr2hex(x): return '#%02x%02x%02x' % (x[0], x[1], x[2]) r = img_data[:, 0]# 红色通道值数组 g = img_data[:, 1]# 绿色通道值数组 b = img_data[:, 2]# 蓝色通道值数组 c = list(map(arr2hex, img_data))# 所有像素对应的颜色码列表 fig = plt.figure() ax = plt.axes(projection='3d') ax.scatter3D(r, g, b, c=c, alpha=0.3, s=1)#创建三维散点图,alpha=0.3:设置透明度(30%不透明),s=1:点的大小为1像素 ax.set_xlabel('R', fontsize=20) ax.set_ylabel('G', fontsize=20) ax.set_zlabel('B', fontsize=20) plt.savefig("../imgs/blog/scatter/{}.jpg".format(number)) for i in range(1, 7): get_color(i) (这是scatterImg.py)
时间: 2025-03-09 18:02:52 浏览: 93
这段Python代码的功能是从给定编号的JPEG图片中提取颜色信息,并生成一张表示该图像所有像素颜色分布的三维散点图。下面将详细解释一下每个部分的作用:
### 模块导入
```python
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from PIL import Image
```
这部分引入了所需的库文件,`numpy`用于数值计算;`matplotlib.pyplot` 和 `mpl_toolkits.mplot3d.Axes3D` 一起用于绘制图形;而`PIL.Image`(来自Pillow包)则负责处理图像。
### 设置压缩比例
```python
compress_rate = 0.2
```
这里设定了一个缩放因子`compress_rate`为0.2,默认会按照原始尺寸缩小到五分之一的比例读取并转换成矩阵形式的数据集,这样做可以减少后续数据量以及加快绘图速度。
### 函数定义:get_color()
此函数接收一个整数参数number作为输入,代表要处理的具体哪张测试图片(`test/{number}.jpg`)。
#### 主体步骤包括:
1. **打开指定序号的图片**
使用Image模块提供的`open()`方法加载目标图片,并调整其大小至原宽高的`compress_rate`倍数(即降低分辨率),以加速处理过程;
2. **转换RGB值**
将修改后的图像内容转存为NumPy数组的形式保存起来,以便于进一步操作。此时img_data是一个二维数组,每一行包含三个元素[R,G,B]分别对应红绿蓝三色通道强度;
3. **辅助工具函数arr2hex()**
定义了一个匿名函数来把每组RGB色彩编码转换成为HTML/CSS标准十六进制字符串格式('#RRGGBB');
4. **拆解出各颜色组件及映射至对应的十六进制标识符**
分离出每一个独立的颜色维度r,g,b的同时也利用上述辅助函数得到它们各自的可视化标签c;
5. **构建坐标轴与添加标题**
创建一个新的Matplotlib Figure实例fig,然后在其上附加一个支持3D投影模式的新Axes对象ax,之后就在这片画布之上绘制出了由一系列彩色的小圆圈构成的空间视图;
6. **标记轴名**
对X、Y、Z三个方向赋予“R”、“G”、“B”的注释文字说明,字体大小设定为了20px;
7. **存储最终结果**
最终将以高清晰度JPG的方式持久化当前图表快照至磁盘上的特定路径下(如blog/scatter目录内);
最后通过循环调用`get_color(i)`对连续六幅样本进行了批量分析展示。
阅读全文
相关推荐















