PPM、PGM、PBM图像格式剖析
今天突然需要用到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图像格式剖析的更多相关文章
- PPM / PGM / PBM 图像文件格式
PPM / PGM / PBM 图像文件格式 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:在进行图像压缩后传输,然后解压缩显示的过程中,通常会用到P ...
- PPM / PGM / PBM 图像文件格式[转]
下面将详细介绍ppm文件 ppm文件是一种图像文件,有其自己的文件格式.ppm文件由两个部分组成:第一个部分是三行ASCII码,这个部分决定了图像的存储格式以及图像的特征:第二个部分就是图像的数据部分 ...
- ppm\pgm格式
PGM 是便携式灰度图像格式(portable graymap file format),在黑白超声图像系统中经常使用PGM格式的图像.文件的后缀名为".pgm". PGM格式图像 ...
- OpenCV入门学习笔记
OpenCV入门学习笔记 参照OpenCV中文论坛相关文档(http://www.opencv.org.cn/) 一.简介 OpenCV(Open Source Computer Vision),开源 ...
- 基础学习笔记之opencv(24):imwrite函数的使用
http://www.cnblogs.com/tornadomeet/archive/2012/12/26/2834336.html 前言 OpenCV中保存图片的函数在c++版本中变成了imwrit ...
- highGUI图形用户界面
#include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> using namespace ...
- 【视频开发】CximageMat 、CximagelplImage 以及 lplImageMat的转换、像素位深度
1.传统的lplImage * -------> Mat格式 IplImage* img = cvLoadImage("greatwave.png", 1); Mat mtx ...
- OpenCV2:Mat
1.Mat基础 在计算机内存中,数字图像是已矩阵的形式保存的.OpenCV2中,数据结构Mat是保存图像像素信息的矩阵,它主要包含两部分:矩阵头和一个指向像素数据的矩阵指针. 矩阵头主要包含,矩阵尺寸 ...
- OpenCV3编程入门笔记(1)图像载入、显示、保存、变换灰度图
图像载入.显示.保存函数: 1 图像载入函数:imread() Mat imread(const string& filename, int flags=1); const ...
随机推荐
- 离线服务器下docker的部署与应用
一分钟内形成docker的模糊概念 网上很多文章避免将docker与虚拟机混为一谈,但对于初学者来说,完全可以将docker当做一种虚拟机技术,只需要牢牢记住一点最重要的区别:docker依赖于物理机 ...
- Java中的冒泡排序
Java中的冒泡排序排序的第一种思想:将第一个值与后面的值相比较,如果第一个值比其他值小,那么将较大的值与第一个换位置,然后继续比较直至所有的数比较完成.这样就可以保证第一个数是最大数.然后将第二个数 ...
- Linux -- 目录基本操作(1)
cd 切换目录 1.切换到指定目录下 #cd 相对/绝对目录 [root@localhost ~]# cd /home/tom/demo [root@localhost demo]# 2.切换到某个用 ...
- java通过IO流复制文件
package kimoji; import java.io.*; public class FileTest { public static void main(String[] args) thr ...
- 改变eclipse左侧目录数字体大小
不可在eclipse中修改,只能通过修改配置文件来实现. 找到eclipse的安装位置(或解压路径): eclipse\plugins\org.eclipse.ui.themes_1.2.100.v2 ...
- 洛谷P4602 [CTSC2018]混合果汁(主席树)
题目描述 小 R 热衷于做黑暗料理,尤其是混合果汁. 商店里有 nn 种果汁,编号为 0,1,\cdots,n-10,1,⋯,n−1 . ii 号果汁的美味度是 d_idi ,每升价格为 p_ipi ...
- es6 入坑笔记(二)---函数扩展,箭头函数,扩展运算符...
函数扩展 1.函数可以有默认值 function demo( a = 10,b ){} 2.函数可以使用解构 function demo( { a = 0,b = 0 } = {} ){ } 3.函数 ...
- 动态链接库 —— Dll 基础
1. DLL 的初识 在 windows 中,动态链接库是不可缺少的一部分,windows 应用程序程序接口提供的所有函数都包含在 DLL 中,其中有三个非常重要的系统 DLL 文件,分别为 Kern ...
- 调试日志——基于stm32的智能声光报警器(二)
今天调试了音频部分的播放功能,这里我采用的是输出pwm来播放声音的方式. 声音的源文件是一个wav文件,然后用一个软件将wav文件转化为一个数组的文件. 要播放的文件就是这个数组文件里面的数据部分,前 ...
- STM32 HAL库学习系列第2篇 GPIO配置
GPIO 库函数 基本就是使用以下几个函数 GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); void H ...