数据科学中的图像、二进制与文本数据处理
立即解锁
发布时间: 2025-09-07 01:56:08 阅读量: 11 订阅数: 47 AIGC 


数据清洗的艺术与实践
# 数据科学中的图像、二进制与文本数据处理
在数据科学领域,我们常常需要处理各种类型的数据,包括图像、二进制序列化数据结构以及自定义文本格式的数据。下面将详细介绍这些数据的处理方法和相关技术。
## 1. 图像数据处理
### 1.1 Pillow 图像存储格式
在 Pillow 格式中,图像以 8 位无符号整数存储,而非 [0.0, 1.0] 范围内的浮点数。这种存储方式便于进行各种转换和归一化操作。例如,对于许多神经网络任务,首选的表示方式是将值以零为中心,标准差为 1。用于存储 Pillow 图像的数组是三维的,因为它不支持在同一对象中堆叠多个图像。
### 1.2 通道操作
在处理图像数据之前,进行通道操作可能会很有用。以下是一个示例,我们将根据蓝色通道的值对图像进行掩码处理,然后选择性地将红色值置零:
```python
# split the Confucius image into individual bands
source = 仲尼.split()
R, G, B = 0, 1, 2
# select regions where blue is less than 100
mask = source[B].point(lambda i: 255 if i < 100 else 0)
source[R].paste(0, None, mask)
im = Image.merge(仲尼.mode, source)
ImageOps.scale(im, 0.5)
```
这个操作的效果在彩色版本中,原本红色较浓的图像边缘会被绿色主导;在灰度版本中,边缘会变暗。
### 1.3 颜色空间转换
将颜色空间从 RGB 转换为 HSL 可能对建模更有帮助。以下是转换的代码示例:
```R
confucius.hsv <- RGBtoHSL(confucius)
data <- as.data.frame(confucius.hsv) %>%
as_tibble %>%
# channels 1, 2, 3 (HSV) as factor
mutate(cc = as.factor(cc))
data
```
转换后,数据的单个值和空间形状都会发生变化,但除了轻微的舍入问题外,转换是无损的。通过按通道进行汇总可以说明这一点:
```R
data %>%
mutate(cc = recode(
cc, '1'="Hue", '2'="Saturation", '3'="Value")) %>%
group_by(cc) %>%
summarize(Mean = mean(value), SD = sd(value))
```
汇总结果如下:
| cc | Mean | SD |
|--------------|----------|--------|
| Hue | 34.5 | 59.1 |
| Saturation | 0.448 | 0.219 |
| Value | 0.521 | 0.192 |
### 1.4 图像元数据
摄影图像可能包含嵌入的元数据,如 Exchangeable Image File Format (Exif) 规定的元数据。这些元数据可以包含时间戳、经纬度等信息。以下是一个获取图像 Exif 元数据的函数:
```python
from PIL.ExifTags import TAGS
def get_exif(img):
txtdata, bindata = dict(), dict()
for tag_id in (exifdata := img.getexif()):
# Lookup tag name from tag_id if available
tag = TAGS.get(tag_id, tag_id)
data = exifdata.get(tag_id)
if isinstance(data, bytes):
bindata[tag] = data
else:
txtdata[tag] = data
return txtdata, bindata
```
我们可以使用这个函数检查图像是否包含元数据:
```python
get_exif(仲尼) # Zhòngní, i.e. Confucius
```
结果显示该图像没有元数据。而另一张在明斯克拍摄的作者与列宁雕像的照片则包含 Exif 元数据:
```python
dqm = Image.open('img/DQM-with-Lenin-Minsk.jpg')
txtdata, bindata = get_exif(dqm)
print(txtdata)
```
元数据包含了许多摄影设置信息,如拍摄时间、相机型号等。
其中,部分二进制数据需要特殊处理。例如,`ExifVersion` 字段可以使用 ASCII 解码:
```python
bindata['ExifVersion'].decode('ascii')
```
对于 `ComponentsConfiguration` 字段,可以使用以下函数进行解码:
```python
def components(cc):
colors = {0: None,
1: 'Y', 2: 'Cb', 3: 'Cr',
4: 'R', 5: 'G', 6: 'B'}
return [colors.get(c, 'reserved') for c in cc]
components(bindata['ComponentsConfiguration'])
```
## 2. 二进制序列化数据结构处理
### 2.1 处理原则
在处理二进制数据时,建议优先使用现有的库。如果遇到不常见的格式,除非有持续的或对性能敏感的处理需求,否则应尽量利用现有的解析器。如果现有的工具只能在不适合用于主要数据科学工作的语言中使用,可以考虑将其作为导出到更易访问格式的工具。
### 2.2 NumPy NPY 格式解析
我们以
0
0
复制全文
相关推荐










