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

PPM、PGM、PBM这三个图像文件格式很少见,其实也不难,分别用于彩色图像、灰度图像、二值图像。这里以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为P6,31 33 30 35对应ASCII为1305。32 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头部用P2和P5分别表示ASCII类型和字节码类型;PBM头部用P1和P4分别表示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. LeetCode40.组合总和|| JavaScript

    给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能使用一次. ...

  2. C#实体更新指定的字段

    接口类: /// <summary> /// 更新指定字段 /// </summary> /// <param name="entity">实体 ...

  3. Machine Learning In Action

    The mind-road of "Machine Learning In Action". Read though the book totally by English!!

  4. Xcode 控制台打印Unicode字符串转换为中文

    在Xcode的控制台里直接打印一个数组或者字典,输出的都是一些Unicode的编码,不方便调试.    要想看到中文,则要去获取对应的key或者数组下标.得到具体某一个对象才能看到中文,给我们调试起来 ...

  5. Innodb和Mysiam引擎的区别

    一:区别 Mysiam: 1.是非事务安全型. 2.是表级锁. 3.如果执行大量的select,Mysiam是更好的选择. 4.select count(*)from table.Mysiam只简单的 ...

  6. 虚拟机系统ubuntu12.04(内网环境下的虚拟主机)开启远程连接访问

    一.工具准备: 1.内网虚拟机Ubuntu12.04系统主机一台,开放端口为:29999 2.远程连接软件:mobaxterm 二.开启步骤: 1.查看端口状态信息: netstat -antl | ...

  7. ionic ios 打包 真机测试常见问题

    1.ionic 项目在windows下正常打包安卓包时  迁移到mac下打包ios时  不需要复制平台目录platforms即可  不用再mac下去安装各种插件信息 2.ionic 下不能访问api信 ...

  8. pycharm使用杂记

    R语言解释器在/opt/local/Library/Frameworks/R.framework/Versions/3.5/Resources/bin/R

  9. 使用nohup或者tmux将程序挂在后台

    程序挂在后台 nohup nohup 命令 & 这样的命令会将屏幕的输出重定向到同目录的nohup.out中,可以使用 > 来重定向输出. nohup 命令 > .log & ...

  10. 30. Insert Interval【LintCode by java】

    Description Given a non-overlapping interval list which is sorted by start point. Insert a new inter ...