判断pgm图片是否完整

PGM图片格式 因为公司使用的人脸识别算法用到了PGM格式的图片作为输入源,查资料备用: PBM图片格式 可移植像素图格式(PPM),可移植灰度图格式(PGM)和可移植位图格式(PBM)是便于跨平台的图像格式。有时候也被统称为PNM格式 文件格式描述 这三种格式在颜色的表示上有差异。PBM是单色,PGM是灰度图,PPM使用RGB颜色。 每个文件的开头两个字节(ASCII码 阅读详情

判断一个文件是否为正确的PGM格式,可以通过检查其文件结构、格式标识和数据完整性来实现。PGM(Portable Graymap Format)是一种灰度图像格式,分为ASCII文本格式(P2) 和二进制格式(P5) 两种,具有明确的格式规范。

以下是具体的判断方法和Python实现代码:

一、PGM格式的核心特征

  1. 文件头标识:

    • 开头必须是"魔数"(Magic Number):P2(ASCII格式)或P5(二进制格式),区分大小写。
    • 紧随魔数的是图像的宽度、高度和最大灰度值(通常为255),以空格或换行分隔。
    • 注释行以#开头,可位于魔数之后、数据之前的任意位置。
  2. 数据结构:

    • P2格式:像素数据为ASCII文本形式的整数,以空格或换行分隔。
    • P5格式:像素数据为二进制字节流,直接存储整数的二进制表示。
  3. 文件扩展名:通常为.pgm,但扩展名可修改,不能仅作为判断依据。

二、验证方法与代码实现

以下是一个完整的Python脚本,用于验证PGM格式的正确性:

import os


def is_valid_pgm(file_path):
    """
    验证文件是否为正确的PGM格式

    参数:
        file_path: PGM文件路径

    返回:
        tuple: (是否有效, 验证信息)
    """
    # 检查文件是否存在
    if not os.path.exists(file_path):
        return False, "文件不存在"

    # 检查文件大小(至少需要包含文件头,最小约10字节)
    file_size = os.path.getsize(file_path)
    if file_size < 10:
        return False, f"文件过小({file_size}字节),不符合PGM格式要求"

    try:
        with open(file_path, 'rb') as f:
            # 读取魔数(前2字节,应为P2或P5)
            magic = f.readline().decode('ascii', errors='ignore').strip()
            if magic not in ['P2', 'P5']:
                return False, f"魔数错误({magic}),PGM格式应为P2(ASCII)或P5(二进制)"

            # 读取宽度、高度和最大灰度值(跳过注释行)
            width, height, max_val = None, None, None
            while True:
                line = f.readline().decode('ascii', errors='ignore').strip()
                if not line:
                    continue  # 跳过空行
                if line.startswith('#'):
                    continue  # 跳过注释行
                # 解析宽度和高度
                if width is None:
                    dims = line.split()
                    if len(dims) >= 2:
                        try:
                            width = int(dims[0])
                            height = int(dims[1])
                        except ValueError:
                            return False, "宽度或高度不是有效整数"
                    else:
                        return False, "缺少宽度或高度信息"
                # 解析最大灰度值
                elif max_val is None:
                    try:
                        max_val = int(line)
                    except ValueError:
                        return False, "最大灰度值不是有效整数"
                    # 最大灰度值必须在1-65535之间
                    if not (1 <= max_val <= 65535):
                        return False, f"最大灰度值无效({max_val}),必须在1-65535之间"
                    break  # 文件头解析完成

            # 验证像素数据长度是否匹配
            if width <= 0 or height <= 0:
                return False, f"无效的图像尺寸(宽:{width},高:{height})"

            total_pixels = width * height
            if magic == 'P2':
                # ASCII格式:读取所有像素文本并验证数量
                data = []
                while len(data) < total_pixels:
                    line = f.readline().decode('ascii', errors='ignore').strip()
                    if not line:
                        continue
                    if line.startswith('#'):
                        continue
                    data.extend(map(int, line.split()))
                if len(data) != total_pixels:
                    return False, f"ASCII格式像素数量不匹配(实际:{len(data)},预期:{total_pixels})"
                # 验证每个像素值是否在有效范围
                for pixel in data:
                    if not (0 <= pixel <= max_val):
                        return False, f"像素值({pixel})超过最大灰度值({max_val})"
            else:  # P5格式
                # 二进制格式:计算预期数据长度(根据灰度值位数)
                bytes_per_pixel = 2 if max_val > 255 else 1
                expected_data_size = total_pixels * bytes_per_pixel
                # 获取当前文件指针位置,计算剩余数据长度
                current_pos = f.tell()
                remaining_size = file_size - current_pos
                if remaining_size != expected_data_size:
                    return False, f"二进制数据长度不匹配(实际:{remaining_size}字节,预期:{expected_data_size}字节)"

        # 所有检查通过
        return True, f"PGM格式正确(类型:{magic},尺寸:{width}x{height},最大灰度值:{max_val})"

    except UnicodeDecodeError:
        return False, "文件包含非ASCII字符,可能不是有效的PGM格式"
    except IOError as e:
        return False, f"文件读取错误:{str(e)}"
    except Exception as e:
        return False, f"格式验证失败:{str(e)}"


# 示例:验证指定PGM文件
if __name__ == "__main__":
    # 替换为需要验证的PGM文件路径
    pgm_path = "D:\\1.pgm"
    valid, message = is_valid_pgm(pgm_path)

    # 输出验证结果
    print("PGM格式验证结果:")
    print(f"状态: {'有效' if valid else '无效'}")
    print(f"详情: {message}")

三、代码验证逻辑说明

该脚本从以下几个关键维度验证PGM格式:

  1. 基础检查:文件是否存在、大小是否合理。
  2. 魔数验证:必须以P2(ASCII)或P5(二进制)开头。
  3. 文件头解析:提取宽度、高度、最大灰度值,确保其为有效整数且范围合理。
  4. 注释处理:跳过以#开头的注释行,避免干扰解析。
  5. 像素数据验证:
    • 对于P2格式:检查像素数量是否与宽高匹配,且每个像素值不超过最大灰度值。
    • 对于P5格式:检查二进制数据长度是否与宽高、灰度值位数匹配(8位灰度值用1字节,16位用2字节)。
显示PGM格式图片的面板实现 PGM是一种简易的图片格式,仅仅通过描述各点的灰度值表示。为了简单,这里采用更简单的图片格式,即只存储各点灰度值。比如一个5*5的图片如下所示。 0 0 10 10 0 0 0 0 10 10 0 0 0 0 10 10 0 0 0 0 10 10 0 0 0 0 10 10 0 0 为了显示这样的图片,这里实现一种简易的面板,从文本中读取灰度值,然后显示。 具体代码如下所示。 阅读详情

相关推荐

人脸图片库的PGM格式解析与应用

可移植灰度图(PGM)格式是图像处理领域常用的格式之一,它为灰度图像的存储和交换提供了一种简单而有效的方法。本章将介绍PGM格式的基本概念、起源以及其核心特点。PGM(Portable GrayMap)格式最初由Russell Kirsch在1950年代为美国国家标准局(NBS)设计,目的是为了简化数字图像的处理。PGM文件以纯文本形式存储图像数据,这使得它们易于在不同系统间传输和修改。PGM(Portable Gray Map)是图像处理中一种常用的数据格式,特别是在灰度图像处理领域。

weixin_28721743的博客 1026

PPM / PGM / PBM 图像格式

PBM(Portable Bitmap Format)黑白图像,只有白与黑, 没有灰 PGM(Portable Greymap Format)灰度图像 PPM(Portable Pixmap Format)RGB彩色图像 三种图像格式 这三种图像格式都通过头2个字节magic number来表明图像的类型(PBM, PGM, PPM), 以及编码方式(ASCII 或 Binary), [magic number]分别有P1, P2, P3, P4, P5, P6六种. Magic ...

reason的博客 1277

振动能量采集技术:从原理到实战,破解物联网供电难题

能量采集技术旨在捕获环境中的废弃能量(如机械振动、热能、光能)并将其转化为电能,其核心原理在于通过压电、电磁、静电或摩擦电等物理效应实现能量形式的转换。这项技术的核心价值在于为物联网(IoT)中难以布线或更换电池的分布式传感器节点、植入式医疗设备等提供近乎永续的电力解决方案,从而解决物联网部署的“最后一米供电”瓶颈。其应用场景广泛覆盖工业预测性维护、结构健康监测、可穿戴设备及消费电子等领域。本文聚焦于振动能量采集这一细分方向,深入剖析了压电式、电磁式、电容式及摩擦纳米发电机(TENG)等主流技术路线的实战考

weixin_42660494的博客 565

PGM便携式灰度图像格式

NET framework框架类库中的Image类和Bitmap类提供了常用图像格式的解析读取和存储,这些常用格式包括BMP,JEPG,GIF,PNG,EXIF,TIFF.但是可惜的是不支持PGM格式,但是只要知道了PGM格式的文件的组织结构,相信要解析他也不是难事了. 1.PGM图像详解 PGM 是便携式灰度图像格式(portable graymap file format),在黑白超声图像...

糖糖糖豆的博客 2138

Python入门基础教程(非常详细)

Python是一门开源免费、通用型的脚本编程语言,它上手简单,功能强大,坚持「极简主义」。Python类库(模块)极其丰富,这使得Python几乎无所不能,不管是传统的Web开发、PC软件开发、Linux运维,还是当下火热的机器学习、大数据分析、网络爬虫,Python都能胜任。这套Python基础教程不是教科书,不会玩弄概念,而是力求口语化和通俗化,让读者尽快入门。如果有小朋友出于兴趣学习Python,请引导他阅读本教程的前半部分,这是基础,可以降低学习成本;...

Yuki1127918的博客 34万+

鸿蒙进阶——HDI及IDL硬件接口IPC框架小结

HDI(Hardware Device Interface):OpenHarmony硬件设备接口,定义系统中跨进程通信的接口,实现服务间的跨进程通信

最美不过,心中有梦,身旁有你! 3901

pgm格式图片

PGM(Portable Graymap Format)是一种便携式灰度图像格式,属于Netpbm图像格式家族。它支持ASCII文本(P2)和二进制(P5)两种存储模式,文件结构简单明了,包含文件头(标识符、尺寸、灰度极值)和像素数据。PGM格式因跨平台兼容性强、易于解析等特点,被广泛应用于计算机视觉算法测试、科学数据可视化和图像处理教学。主流图像处理库(如PIL、OpenCV)均支持PGM文件的读写操作,使其成为处理灰度图像的理想选择。

doubleintfloat的博客 1649

UE5网络模块实战:属性复制、RPC与联机开发踩坑指南

多人联机开发中,网络同步是核心难题。UE5网络模块以服务器权威为基础,通过Actor复制、RPC和所有权机制实现多端状态一致。理解属性复制与OnRep回调、区分Server/Client/Multicast RPC的适用场景,是构建稳定联机架构的关键。本文结合数字孪生与多端协作场景,探讨如何将渲染与逻辑分离,并针对打包后网络失效、端口防火墙、崩溃排查等工程实践问题给出解决方案。通过蓝图接口解耦表现层,利用C++创建StaticMesh组件实现服务器逻辑与客户端表现分离,同时注意专用服务器不加载渲染依赖(如D

weixin_29010003的博客 269

PGM格式图像详解

本文转自这里 NET framework框架类库中的Image类和Bitmap类提供了常用图像格式的解析读取和存储,这些常用格式包括BMP,JEPG,GIF,PNG,EXIF,TIFF。但是可惜的是不支持PGM格式,但是只要知道了PGM格式的文件的组织结构,相信要解析他也不是难事了。 PGM图像详解 PGM 是便携式灰度图像格式(portable graymap file format),在黑白超声图像系统中经常使用PGM格式的图像。文件的后缀名为”.pgm”,PGM格式图像格式分为两类:P2和P5

EmbeddedCoder 的优快云博客 4160

电源完整性必看!用SIwave提取PDN阻抗曲线的3个关键设置与常见报错解决

本文深入探讨了在SIwave中进行电源完整性(PI)仿真时,提取PDN阻抗曲线的三个核心设置要点。重点解析了端口阻抗设为0.1欧姆的物理意义与SYZ参数仿真中的阻抗匹配原则,并提供了针对常见收敛性问题和模型误差的实战排查思路,旨在帮助工程师获得更精确可靠的仿真结果,为去耦电容优化提供依据。

b9c0d的博客 351

abaqus运行报错 WindowsError:[Error 2]

abaqus提交job总是提示“WindowsError [Error 2”,报这个错误,可能是由于安装其他软件改变了abaqus软件的路径导致,总结了看到的教程,按照下面的方法可以解决这个问题。 步骤一:找到你的abaqus安装路径(我是按照一个安装视频安装的,安装路径为SIMULI1),然后找到SIMULIA文件夹,点击进入后找到commands文件夹,将这个路径复制下来。 步骤二:我的电脑右键属性,在左侧中找到高级系统设置并...

az101za的博客 1万+

pgm file format

 pgmUpdated: 03 October 2003 Table Of Contentshttp://netpbm.sourceforge.net/doc/pgm.html NAMEpgm - Netpbm grayscale image formatDESCRIPTIONThis program is part of Netpbm.The PGM

ding_net的专栏 1071

SAP HR模块配置假期日历和缺勤类型

SAP的HR模块。业务顾问在实施时一般会配置未来10年的假期日历,到期后再进行配置。同时,增加请假类型(缺勤信息类型)。记录这一过程。

福来阁86号技师的妖孽日常 5523

java JPG等图片格式转成PGM

不想看废话的直接跳到实现部分 引言 原本以为网上会有很多这方面的工具类可以实现,但是发现寥寥无几,而且大部分还都是其他的语言的。 最近在研究人脸的识别技术,大部分的人脸识别开源库都是使用pgm的图片格式作为识别图片格式。 因此测试和使用时,必然要把jpg等彩色图片转为pgm的灰度图片格式使用。 在讲方法之前,先进行一下图片的格式科普: PPM(Portable PixMap)是portable像素图片,是由netpbm项目定义的一系列的portable图片格式中的一个。这些图片格式..

Keith_Prime的博客 2900

eCognition易康操作教程(一):如何利用eCognition易康软件进行影像分割之棋盘分割、四叉树分割、光谱差异分割

进程执行完成后,植被覆盖区域与裸地区域合并了。第三步:清除分割结果,点击“Image Objects”菜单栏,点击“Delete Level(s)”,选中“ResultLevel1”,点击”ok”删除棋盘分割结果。四叉树分割之后,有的正方形大一些,有的正方形小一些,大说明该区域的光谱特性更加均一,而小说明不太均一。Leve:选择运行算法的矢量层名称,这里选择四叉树分割算法得到的矢量层“ResultLevel2”。Image Layer weights:图层权重,这里设置为“1,1,1,1”。

蒹葭苍苍 4608

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

.pgm图片简介以及Python读取.pgm图片的方法

一、什么是.pgm图片? .pgm文件由于模式的不同其数据存储方式也有所不同,下面介绍P2和P5模式的.pgm文件的格式。 1、P2模式的.pgm文件 P2模式的.pgm文件存储如下图所示: 其内容释义如下: ①第一行内容“P2”表示.pgm文件的模式。 ②第二行“128, 120”表示图片的宽度、图片的高度。 ③第三行“156”表示图片数据的最大值。 ④第三...

小太阳~ 3万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

对pgm格式图片的批量格式转换(pgm)

在图像处理的过程中,数据集中往往出现pgm、jpg、bmp等格式的图像,对于pgm图像无法预览打开,对数据集的浏览造成了一定的困难。这里以base-boss数据集为例,将10000张pgm图片批量转化为bmp、jpg等格式。

weixin_45843913的博客 4312

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

python读取pgm格式图片并显示

涉及到使用BioID_Face_Database人脸数据集,而其中图片的存储格式是.pgm,所以简单写了几句python代码来读取并显示图片进行查看,代码如下: import os from PIL import Image def eachFile(filepath): for root, dirs, files in os.walk(filepath): for ...

xiakj的专栏 5222

C++ pgm转jpg格式 网页显示图片

参考https://mp.youkuaiyun.com/postedit/91562301 #include <iostream> #include <fstream> #include "jpegenc.h" #include <cstdio> int main() { FILE* fp; std::ifstream pgmfile; std:...

weixin_37815019的博客 1642

pgm图片格式

简单介绍 pgm格式图片是灰度图格式中一种最简单的额格式; 由两部分组成:文件头+像素数据; 1.文件头 文件头信息依次包括: 1.1 PGM文件的类型:文件类型包括P2和P5两种格式; 1.2 图像的宽度; 1.3 图像的高度; 1.4 图像灰度值的最大值; 以上文件头的信息采用的是ASCII码形式存储,所以可以直接使用记事本打开文件,看到文件头信息; PGM文件头采用合法分隔符分开,在PGM中合法分隔符包括:空格、回车、TAB、换行符; 2.像素数据 像素数据根据文件头信息中的P

weixin_43298884的博客 2542

C# 处理PGM、Pcx、Pnm、Ras、Sgi、Tga、Xpm 等图片,读取与显示

如题,最近的项目遇到需要处理小众图片格式,于是在度娘的帮助下,两天未果。 此刻用激动的心情发一张显示的PGM图片的效果。 有了满意的效果,才能继续下去。在国内没有找到,之后就去cn.bing.com。根据搜索出来的结果,有了新的启发,就是使用NugGet包处理问题。如下图: 于是锁定了前两个。但是问题来了,安装了包,却没有对应的文档可用。还得下载了源码看! 调用实例: pub...

静哥亻门 1368

在背景为灰色的PGM图片中,提取地图。

用gmapping存储的PGM图片格式的地图,但是地图比例不好,想多余部分剔除 利用opencv,完成了这一工作,遍历全图找到地图位置,然后复制感兴趣区域,最后保存。 代码如下: #include "cv.h"   #include "highgui.h"   using namespace std; using namespace cv; /***    设置图像灰

qq_33179208的博客 1686

Python 读取 PGM 格式图片,RGB 转 PGM

首先了解一下PGM格式: .pgm图片简介以及Python读取.pgm图片的方法 Python pgm解析和格式转换 PGM格式图像详解 【图像格式】 PPM/PGM/PBM格式编码详解 Python 读取 PGM 格式图片 from PIL import Image import numpy as np import matplotlib.pyplot as plt def read_i...

不正先生的博客 1845

python读取pgm格式图片文件

import re import numpy def read_pgm(filename, byteorder='>'):     """Return image data from a raw PGM file as numpy array.     Format specification: http://netpbm.sourceforge.net/doc/pgm.h

autocrat1989的博客 4665

pgm图像修改java_PGM图片格式与代码

这两天在搞神经网络,里面的一个人脸数据库的图片格式是PGM,事实上之前早就知道了这个图片格式,可是没去深究这个图片格式的数据究竟是什么安排的。搜索了下百度百科,发现介绍的真是简单,以下就自己来系统地整理一下。PGM是Portable Gray Map的缩写。它是灰度图像格式中一种最简单的格式标准。另外两种与之相近的图片格式是PBM和PPM。它们分别相应着黑白图像和彩色图像。PGM的数据存放方式相比...

weixin_36381252的博客 731

PGM檔案格式

PGM檔案格式PGM檔案格式參考連結 PGM檔案格式 PGM全文Portable Gray Map,是一種圖片檔案格式。PGM圖像包含了以下幾個元素: 一個magic number,代表檔案格式。PGM圖片的magic number是"P5"這兩個字元。 空白符(空格,tab,CR,LF) 寬度(W),用ASCII字元表示 空白符 高度(H),用ASCII字元表示 空白符 最大灰度值(Maxva...

keineahnung2345的博客 831
上一篇: python列表 append externd
下一篇: pgm格式图片
越甲八千
博客等级 码龄11年 2953粉丝 553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值