You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python解码千兆以太网UDP图像数据并提取像素值

问题1:将原始UDP数据转换为Wireshark解码格式

Wireshark的解码本质是按探测器定义的UDP载荷结构解析二进制数据——你尝试的utf-16解码无效,是因为数据本身不是文本类型,而是结构化的二进制流。解决思路是先明确探测器的UDP包格式,再用Python的struct模块解析:

  1. 从Wireshark抓包结果中,对应出UDP载荷的结构:比如是否包含固定长度的头部(如图像宽高、帧编号)、像素数据的类型(16位无符号整数?32位浮点数?)、字节序(大端/小端)。
  2. 用struct.unpack按对应格式解析二进制数据。

示例代码(假设探测器格式为:4字节大端宽 + 4字节大端高 + 2字节大端无符号像素值):

import struct

# 假设已通过UDP接收的原始二进制数据存在data变量中
# 解析头部:!表示大端字节序,I代表4字节无符号整数
width, height = struct.unpack('!II', data[:8])

# 解析像素数据:总像素数为width*height,H代表2字节无符号整数
pixel_format = f'!{width*height}H'
pixels = struct.unpack(pixel_format, data[8:])

如果Wireshark显示是小端字节序,把格式字符串中的!换成<即可,解析结果将和Wireshark的结构化解码一致。

问题2:提取1000-10000区间的像素值并组成图像

拿到解析后的像素列表后,按以下步骤处理:

  1. 过滤像素:保留1000≤值≤10000的像素,超出范围的可设为0或其他填充值。
  2. 行列重组:将一维像素列表转为对应宽高的二维数组。
  3. 生成图像:用图像处理库将二维数组转为可视化图像。

示例代码(用PIL库):

from PIL import Image
import numpy as np

# 过滤像素:符合范围的保留原值,否则设为0
filtered_pixels = [p if 1000 <= p <= 10000 else 0 for p in pixels]

# 转为二维数组(height行,width列)
pixel_array = np.array(filtered_pixels).reshape((height, width))

# 方案1:归一化到0-255生成8位灰度图
normalized_array = ((pixel_array - 1000) / (10000 - 1000) * 255).astype(np.uint8)
img_8bit = Image.fromarray(normalized_array)

# 方案2:直接生成16位灰度图(保留原始数值范围)
img_16bit = Image.fromarray(pixel_array.astype(np.uint16))

# 保存或显示图像
img_8bit.save('filtered_8bit.png')
img_16bit.save('filtered_16bit.tiff')
img_8bit.show()

内容的提问来源于stack exchange,提问作者mery shadow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:45:57