Python解析LMDB格式图像数据并保存为图片
本文介绍如何使用Python读取LMDB数据库中的图像数据。通过Caffe的Datum对象解析二进制流,提取通道信息,并利用PIL库将单通道数据合并为RGB图像保存。适用于验证LMDB写入结果或进行数据逆向分析的场景。
LMDB图像数据读取原理
LMDB(Lightning Memory-Mapped Database)常用于存储大规模图像数据,特别是在深度学习框架如Caffe中。当需要将LMDB中的二进制数据还原为可视图像时,关键在于理解其内部存储结构。通常,图像数据被序列化在 Datum 对象中,包含通道数、宽高及像素数据。读取过程需打开环境、创建事务与游标,并逐条解析二进制流。
代码实现步骤
以下是完整的Python实现代码,依赖 lmdb、caffe 和 PIL 库。代码通过遍历游标获取每个键值对,解析 Datum 后按通道拆分像素数据,最终合并为RGB图像并保存。
from PIL import Image
def read_from_lmdb(lmdb_path,img_save_to):
try:
lmdb_env=lmdb.open(lmdb_path, map_size=3221225472)
lmdb_txn=lmdb_env.begin()
lmdb_cursor=lmdb_txn.cursor()
datum=caffe.Datum()
datum_index=0
for key,value in lmdb_cursor:
datum.ParseFromString(value)
label=datum.label
data=datum.data
channel=datum.channels
print ('Datum channels: %d' % datum.channels)
print ('Datum width: %d' % datum.width)
print ('Datum height: %d' % datum.height)
print ('Datum data length: %d' % len(datum.data))
print ('Datum label: %d' % datum.label)
size=datum.width*datum.height
pixles1=datum.data[0:size]
pixles2=datum.data[size:2*size]
pixles3=datum.data[2*size:3*size]
#Extract images of different channel
image1=Image.frombytes('L', (datum.width, datum.height), pixles1)
image2=Image.frombytes('L', (datum.width, datum.height), pixles2)
image3=Image.frombytes('L', (datum.width, datum.height), pixles3)
#注意三通道的顺序,如果LMDB中图像是按照BGR存储的则需要按照:image3,image2,image1的顺序合并为RGB图像。PIL中图像是按照RGB的顺序存储的
image4=Image.merge("RGB",(image3,image2,image1))
image4.save(img_save_to+str(key)+".jpg")
datum_index+=1
print "extracted"
finally:
lmdb_env.close()关键注意事项
- 通道顺序:LMDB中图像可能按BGR顺序存储(常见于Caffe),而PIL默认按RGB处理。代码中通过
Image.merge("RGB",(image3,image2,image1))将第三个通道作为R,第一个通道作为B,以正确还原颜色。 - 内存映射大小:
map_size=3221225472设置了3GB的映射空间,若LMDB文件较大,需根据实际数据量调整此参数,避免lmdb.MapFullError。 - 异常处理:使用
try...finally确保即使解析出错,数据库环境也能正确关闭,防止资源泄漏。
以上就是Python读取LMDB中图像方法的详细内容,更多关于Python图像处理或LMDB数据解析的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









