今天突然需要用到PPM这个图像文件格式,之前没见过,在此记录一下。

PPMPGMPBM这三个图像文件格式很少见,其实也不难,分别用于彩色图像、灰度图像、二值图像。这里以PPM格式为例。

PPM格式有两种类型:字节码和ASCII。前者是二进制文件,后者是纯文本文件。

使用convert命令可以将图像转为PPM格式:

# 字节码
$ convert xxx.jpg xxx.ppm
# ASCII
$ convert xxx.jpg -compress none xxx.ppm

ASCII类型的PPM文件示例:

P3
1305 1305
255
229 232 237 228 231 236 ...

第1行是P3,第2行是图像大小,第3行是最大值,一般是255。从第4行起就是每个像素的颜色值了,像素顺序一般是从左到右、从上到下,通道顺序一般是RGB。

字节码类型的PPM文件示例:

50 36 0A 31 33 30 35 20 31 33 30 35 0A 32 35 35 0A E5 E8 ED E4 E7 EC ...

最开始的50 36对应ASCII为P631 33 30 35对应ASCII为130532 35 35对应ASCII为255。后面的像素值以十六进制表示:

$ bc -q
obase=10
ibase=16
E5
229
E8
232
ED
237

Python的Pillow库可以读取、存储字节码类型的PPM格式:

from PIL import Image

# 存储PPM格式
im = Image.open('xxx.jpg')
im.save('xxx.ppm') # 读取PPM格式
im = Image.open('xxx.ppm')
im.show()

PGM头部用P2P5分别表示ASCII类型和字节码类型;PBM头部用P1P4分别表示ASCII类型和字节码类型,但没有像PPM第3行的最大值,ASCII类型的像素值都是0或1。

PPM、PGM、PBM图像格式剖析的更多相关文章

  1. PPM / PGM / PBM 图像文件格式

    PPM / PGM / PBM 图像文件格式 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:在进行图像压缩后传输,然后解压缩显示的过程中,通常会用到P ...

  2. PPM / PGM / PBM 图像文件格式[转]

    下面将详细介绍ppm文件 ppm文件是一种图像文件,有其自己的文件格式.ppm文件由两个部分组成:第一个部分是三行ASCII码,这个部分决定了图像的存储格式以及图像的特征:第二个部分就是图像的数据部分 ...

  3. ppm\pgm格式

    PGM 是便携式灰度图像格式(portable graymap file format),在黑白超声图像系统中经常使用PGM格式的图像.文件的后缀名为".pgm". PGM格式图像 ...

  4. OpenCV入门学习笔记

    OpenCV入门学习笔记 参照OpenCV中文论坛相关文档(http://www.opencv.org.cn/) 一.简介 OpenCV(Open Source Computer Vision),开源 ...

  5. 基础学习笔记之opencv(24):imwrite函数的使用

    http://www.cnblogs.com/tornadomeet/archive/2012/12/26/2834336.html 前言 OpenCV中保存图片的函数在c++版本中变成了imwrit ...

  6. highGUI图形用户界面

    #include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> using namespace ...

  7. 【视频开发】CximageMat 、CximagelplImage 以及 lplImageMat的转换、像素位深度

    1.传统的lplImage * -------> Mat格式 IplImage* img = cvLoadImage("greatwave.png", 1); Mat mtx ...

  8. OpenCV2:Mat

    1.Mat基础 在计算机内存中,数字图像是已矩阵的形式保存的.OpenCV2中,数据结构Mat是保存图像像素信息的矩阵,它主要包含两部分:矩阵头和一个指向像素数据的矩阵指针. 矩阵头主要包含,矩阵尺寸 ...

  9. OpenCV3编程入门笔记(1)图像载入、显示、保存、变换灰度图

    图像载入.显示.保存函数: 1         图像载入函数:imread()   Mat imread(const string& filename, int flags=1); const ...

随机推荐

  1. ArrayList两个对象之间的赋值

    List<String> list1 = new ArrayList<String>(); List<String> list2 = new ArrayList&l ...

  2. 查看apache当前并发访问数和进程数

    1.查看apache当前并发访问数: netstat -an | grep ESTABLISHED | wc -l 对比httpd.conf中MaxClients的数字差距多少. 2.查看有多少个进程 ...

  3. 3.Spring Cloud初相识--------Ribbon客户端负载均衡

    前言: 在生产环境中,未避免单点故障,每个微服务都会做高可用部署. 通白的说,就是每一个一模一样的服务会根据需求提供多分在多台机器上. 那么在大并发的情况下,如何分配服务可以快速得到响应,就成为了我们 ...

  4. java核心技术-多线程之基本使用

    多线程程序好处就是可以提高cpu使用率和系统的性能.这里举个例子,民以食为天,咱们以餐馆为例(后面基本上都用餐馆作为对象),后面如果没有特殊说明均采用本节相关术语,围绕餐馆我们可以抽象出如下几个角色以 ...

  5. ubuntu 如何进行文件、夹删除等操作

    rm [选项] 文件-f, --force 强力删除,不要求确认-i 每删除一个文件或进入一个子目录都要求确认-I 在删除超过三个文件或者递归删除前要求确认-r, -R 递归删除子目录-d, --di ...

  6. vlookup函数使用---execl公式

    目录 vlookup函数使用---execl公式 1.用途: 2.函数语法: 3.使用方式: 4.实际案例+步骤解析 5.常见错误 vlookup函数使用---execl公式 1.用途: 我们有一张工 ...

  7. 10JavaScript作用域

    (作用域可访问变量的集合) 1.JavaScript 作用域 在 JavaScript 中, 对象和函数同样也是变量. 在 JavaScript 中, 作用域为可访问变量,对象,函数的集合. Java ...

  8. 关于iOS启动页launchImage无法显示解决办法

    在没有美工的时候,往往项目开发到一半,才拿到icon和launchImage图片,这时在添加对应图片之后发现并没有正常显示,这就蛋疼了,以下列出几种解决方式. 关于设置launchImage: 工程配 ...

  9. react native android模拟机调试

    模拟机调试首先要确认你的环境变量的path中是不是有adb的路径,adb一般在android的adk目录下的platform-tools下,android目录默认是在c盘user/administra ...

  10. 通过XShell实现windows文件上传到Linux服务器上

    .XShell上传文件到Linux服务器上 在学习Linux过程中,我们常常需要将本地文件上传到Linux主机上,这里简单记录下使用Xsheel工具进行文件传输 1:首先连接上一台Linux主机 2: ...