python读取raw binary图片并提取统计信息

本文介绍如何使用Python读取raw二进制图像文件,并详细阐述了如何从非零数据中获取最大值、最小值、偏斜度和峰度等统计信息,适合Python初学者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用python语言读取二进制图片文件,并提取非零数据统计信息(例如:max,min,skewness and kurtosis)

python新手,注释较少,欢迎指教

import struct
import math
import numpy
import scipy.stats

filename = input('enter file name')
f = open(filename, 'rb')
f.seek(0, 0)

c = 0
numOfZero = 0
s = 0
num = []
m = 0

while True:
    temp = f.read(4)
    if len(temp) == 0:
        break
    else:
        c = c + 1
print(c)
print(numOfZero)

sum = 0
squSum = 0
min = 2000
max = 0
list = []
num = []
f.seek(0, 0)

for i in range(0, c):
    a = f.read(4)
    b = struct.unpack('<f', a)
    list.append(b[0])
    if list[i] == 0:
        numOfZero = numOfZero + 1
    else:
        num.append(b[0])
    if list[i] > max:
        max = list[i]
    if list[i] < min and list[i] != 0:
        min = list[i]
    sum = sum + list[i]

stan_Dev = numpy.std(num)
median = numpy.median(num)
sk = scipy.stats.skew(num)
ku = scipy.stats.kurtosis(num)

print('numOfZero = ', numOfZero)
print('sum = ', sum)
print
<think>好的,用户想要比较两个STL文件的内容是否一致。首先,我需要了解STL文件的结构。STL文件通常有两种格式:ASCII和二进制。ASCII格式的STL文件以明文存储三维模型的三角形面片信息,而二进制格式则更为紧凑,但需要解析特定的数据结构。 接下来,我需要考虑如何用Python读取这两种格式的文件。对于ASCII文件,可以逐行读取解析每个三角形的数据,包括顶点坐标和法线向量。二进制文件则需要按照特定的字节结构来解析,通常包括头部信息、三角形数量以及每个三角形的数据块。 然后是比较步骤。直接比较文件的二进制数据可能不可靠,因为即使模型相同,不同的生成软件可能会在头部信息或数据排列顺序上有所不同。因此,更可靠的方法是解析出所有三角形,检查它们的几何数据是否一致,忽略可能的顺序差异。可能需要将三角形进行排序后再比较,或者计算某种哈希值来快速判断是否相同。 在实现过程中,需要注意以下几点:首先,确保正确解析二进制文件的字节顺序(通常是little-endian);其次,处理浮点数精度问题,避免由于小数点后的微小差异导致误判;最后,考虑性能问题,大文件可能需要优化读取和比较的方法。 此外,用户提供的引用中提到不同Python版本编译的pyd文件不兼容的问题,这里虽然不涉及C扩展,但需要注意Python环境的一致性,确保使用的库版本兼容。例如,使用numpy进行数据操作时,需确保不同环境中numpy版本不会导致数据解析差异。 最后,生成相关问题需要考虑用户可能的后续疑问,例如如何处理不同格式的STL文件,性能优化方法,以及如何处理大文件比较等。</think>### 如何用Python读取比较两个STL文件的一致性? #### 步骤1:理解STL文件格式 STL文件分为ASCII和二进制两种格式: 1. **ASCII格式**:以明文存储三角形面片信息,结构如下: ``` solid 文件名 facet normal 法向量 outer loop vertex 顶点1坐标 vertex 顶点2坐标 vertex 顶点3坐标 endloop endfacet endsolid ``` 2. **二进制格式**:包含80字节头部+4字节三角形数量+N个三角形数据块(每个块含法向量、3顶点坐标和2字节属性)[^2]。 #### 步骤2:读取STL文件 ##### 方法1:使用`numpy-stl`库(推荐) ```python from stl import mesh def read_stl(file_path): return mesh.Mesh.from_file(file_path) ``` ##### 方法2:手动解析二进制文件 ```python import struct def read_binary_stl(file_path): with open(file_path, 'rb') as f: header = f.read(80) # 跳过头部 triangle_count = struct.unpack('<I', f.read(4))[0] # 小端解析 data = [] for _ in range(triangle_count): # 法向量(3*float) + 顶点(9*float) + 属性(2字节) chunk = f.read(50) data.append(struct.unpack('<12f2s', chunk)) return data ``` #### 步骤3:比较文件内容 ##### 直接字节比对(仅适用于完全一致的生成方式) ```python def compare_raw_bytes(file1, file2): with open(file1, 'rb') as f1, open(file2, 'rb') as f2: return f1.read() == f2.read() ``` ##### 精确几何比对(推荐) ```python import numpy as np def compare_geometry(file1, file2): mesh1 = read_stl(file1) mesh2 = read_stl(file2) # 比较三角形数量 if len(mesh1.vectors) != len(mesh2.vectors): return False # 对三角形排序后逐个比对 sorted1 = sorted(mesh1.vectors, key=lambda x: x.tobytes()) sorted2 = sorted(mesh2.vectors, key=lambda x: x.tobytes()) return np.allclose(sorted1, sorted2, atol=1e-6) # 考虑浮点精度误差 ``` #### 步骤4:处理特殊场景 1. **不同生成软件产生的文件**:忽略头部信息,只比较几何数据 2. **浮点数精度差异**:使用`numpy.allclose()`代替直接相等判断 3. **顶点顺序不同**:对每个三角形的顶点进行排序后再比较 ```python def normalize_vectors(vectors): # 对每个三角形的三个顶点进行排序 return [sorted(triangle, key=lambda v: tuple(round(x,6) for x in v)) for triangle in vectors] ``` ### 完整示例代码 ```python from stl import mesh import numpy as np def compare_stl(file1, file2): try: mesh1 = mesh.Mesh.from_file(file1) mesh2 = mesh.Mesh.from_file(file2) except Exception as e: print(f"文件读取错误: {str(e)}") return False # 标准化处理 def process(data): sorted_data = sorted(data.vectors, key=lambda x: x.tobytes()) return np.round(sorted_data, decimals=6) return np.array_equal(process(mesh1), process(mesh2)) # 使用示例 result = compare_stl("part1.stl", "part2.stl") print("文件一致" if result else "文件不同") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值