pbm/pgm/ppm图片的读写(Matlab)
在图像处理领域,PBM、PGM和PPM是一种基于文本格式的简单图像文件类型,统称为PBMPlus或PBM格式。这些格式是最早用于位图图像的标准之一,尤其适用于早期的Unix系统。Matlab作为强大的数值计算和数据可视化环境,提供了处理这种格式图像的功能。本文将详细探讨如何在Matlab中读取和写入PBM、PGM和PPM图片,并介绍相关的编程知识。 PBM(Portable Bitmap)用于黑白图像,PGM(Portable Graymap)用于灰度图像,而PPM(Portable Pixmap)则用于彩色图像。这三种格式都是基于ASCII的,所以它们的内容可以被人类直接阅读。PBM文件以“P1”或“P4”标识,PGM文件以“P2”或“P5”,PPM文件以“P3”或“P6”标识,数字代表其特定的二进制或ASCII编码方式。 在Matlab中,可以使用`imread`和`imwrite`函数来操作这些文件。`imread`用于读取图像,`imwrite`用于保存图像。但需要注意的是,Matlab内置对PBM/PGM/PPM的支持可能有限,因此可能需要自定义函数来处理这些特定格式。 例如,我们可以创建一个自定义的读取函数,如下: ```matlab function img = readPBMPPM(filename) fid = fopen(filename, 'r'); header = fgets(fid); switch header(2) case '1', % PBM ASCII fmt = 'PBM'; data = textscan(fid, '%s', 'HeaderLines', 1, 'Delimiter', ''); img = logical(str2double(data{1})); case '4', % PBM binary fmt = 'PBM'; [width, height] = sscanf(fscanf(fid, '%d %d'), '%d %d'); fseek(fid, 1, 'bof'); % skip "1" img = fread(fid, width*height, 'uint8=>logical') == 1; case '2', % PGM ASCII fmt = 'PGM'; data = textscan(fid, '%s%d%d', 'HeaderLines', 1, 'Delimiter', ''); maxVal = str2double(data{3}); img = reshape(str2double(data{2}'), ... str2double(data{1}(3:end)), []); img = uint8(img / maxVal * 255); case '5', % PGM binary fmt = 'PGM'; [width, height] = sscanf(fscanf(fid, '%d %d'), '%d %d'); maxVal = fscanf(fid, '%d', 1); fseek(fid, 1, 'bof'); % skip "1" img = fread(fid, width*height, 'int16=>uint8') ./ maxVal * 255; case '3', % PPM ASCII fmt = 'PPM'; data = textscan(fid, '%s%d%d%d', 'HeaderLines', 1, 'Delimiter', ''); maxVal = str2double(data{4}); img = reshape(str2double(data{2}'), ... str2double(data{1}(3:end)), str2double(data{1}(1:end-3))); img = uint8(img / maxVal * 255); case '6' % PPM binary fmt = 'PPM'; [width, height] = sscanf(fscanf(fid, '%d %d'), '%d %d'); maxVal = fscanf(fid, '%d', 1); fseek(fid, 1, 'bof'); % skip "1" img = fread(fid, width*height*3, 'uint8') ./ maxVal * 255; img = permute(reshape(img, 3, [], width, height), [2 4 3 1]); end fclose(fid); end ``` 该函数首先读取文件头以确定文件类型,然后根据不同的格式读取图像数据并转换为Matlab中的矩阵表示。对于PPM文件,还需要处理颜色通道。 相应地,我们可以编写一个自定义的写入函数: ```matlab function writePBMPPM(filename, img, fmt) if nargin < 3 fmt = ''; end switch fmt case '' fmt = islogical(img) ? 'PBM' : (max(max(img)) > 255) ? 'PPM' : 'PGM'; case {'PBM', 'PGM', 'PPM'} % nothing to do otherwise error('Unsupported format.'); end fid = fopen(filename, 'w'); fprintf(fid, 'P%i\n', find(strcmp({'P1', 'P2', 'P3', 'P4', 'P5', 'P6'}, [fmt ''])); switch fmt case 'PBM' fprintf(fid, '%d %d\n', size(img, 2), size(img, 1)); if islogical(img) fprintf(fid, '%d ', img(:)'); else fwrite(fid, img(:)', 'uint8'); end case 'PGM' fprintf(fid, '%d %d %d\n', size(img, 2), size(img, 1), max(max(img))); fwrite(fid, img(:)', 'uint8'); case 'PPM' fprintf(fid, '%d %d %d\n', size(img, 3), size(img, 2), size(img, 1)); fwrite(fid, permute(img, [3 2 1]), 'uint8'); end fclose(fid); end ``` 这个函数会自动检测输入图像的数据类型和最大值,然后选择合适的格式进行写入。 在实际使用中,你可以这样调用这两个函数: ```matlab % 读取图像 img = readPBMPPM('input.pbm'); % 处理图像... % 保存图像 writePBMPPM('output.ppm', img, 'PPM'); ``` 总结一下,Matlab虽然内建的图像读写功能可能不直接支持PBM/PGM/PPM格式,但通过编写自定义函数,我们可以轻松地实现这些格式的读取和写入。了解这些基本的图像格式以及如何在Matlab中操作它们,对于进行图像处理和分析是非常有帮助的。
- 1
- zhu_yuxiang2017-09-25算法是可用的
- AAA苏打饼干专业扎孔2020-05-15运行不了 错误使用 fread 文件标识符无效。使用 fopen 生成有效的文件标识符。
- weixin_415934182018-05-05个人觉得还是有用的
- myfanmy2017-06-06还算比较有用的
- fanliang122017-05-31还是有用的
- 粉丝: 286
- 资源: 20
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 淘宝客项目,支持App,微信小程序,QQ小程序.zip
- 第16课作业周旭.iml
- 海风小店,商城,微信小开源程序商城服务器端.zip
- 技术资料分享uCOS-II原理3很好的技术资料.zip
- 【java毕业设计】食品安全管理系统源码(springboot+vue+mysql+说明文档+LW).zip
- 海风小店,商城,微信小开源程序商城管理后台,后台管理,VUE.zip
- 【java毕业设计】流浪动物救助平台源码(springboot+vue+mysql+说明文档+LW).zip
- 技术资料分享uCOS-II原理2很好的技术资料.zip
- 流动图书馆微信小程序引入.zip
- 【java毕业设计】某大学外卖系统源码(springboot+前端+mysql+说明文档+LW).zip