python create .pgm file

时间:2016-10-17 08:56:13

标签: python image format pgm

首先,我必须提到我在这个页面上阅读的内容包括: Create binary PBM/PGM/PPM

我还阅读了解释.pgm文件格式.pgm file format的页面。我知道.pgm“raw”格式和.pgm“plain”格式之间存在差异。我也知道这些文件被创建为8位(允许0-255之间的整数值)或16位(允许0-65535之间的整数值)二进制文件。

这些信息中的任何一个都无法帮助我编写一段干净的代码,以8位16位格式创建一个普通的.pgm文件。

这里我附上了我的python脚本。此代码导致文件具有失真(整数)值!

import numpy as np

# define the width  (columns) and height (rows) of your image
width = 20
height = 40

p_num = width * height
arr = np.random.randint(0,255,p_num)

# open file for writing 
filename = 'test.pgm'
fout=open(filename, 'wb')

# define PGM Header
pgmHeader = 'P5' + ' ' + str(width) + ' ' + str(height) + ' ' + str(255) +  '\n'

pgmHeader_byte = bytearray(pgmHeader,'utf-8')

# write the header to the file
fout.write(pgmHeader_byte)

# write the data to the file 
img = np.reshape(arr,(height,width))

for j in range(height):
    bnd = list(img[j,:])
    bnd_str = np.char.mod('%d',bnd)
    bnd_str = np.append(bnd_str,'\n')
    bnd_str = [' '.join(bnd_str)][0]    
    bnd_byte = bytearray(bnd_str,'utf-8')        
    fout.write(bnd_byte)

fout.close()

作为此代码的结果,正在创建.pgm文件,其中数据完全更改(就像挤入(10-50)范围) 我将不胜感激对此代码的任何评论/更正。

1 个答案:

答案 0 :(得分:1)

首先,您的代码在语句'中缺少\n'的开放pgmHeader = 'P5' + ...。第二个没有fout = open(filename, 'wb')。主要问题是您使用ASCII格式对像素数据进行编码,您应该使用binary格式对其进行编码(因为您使用了幻数' P5'):

for j in range(height):
    bnd = list(img[j,:])
    fout.write(bytearray(bnd)) # for 8-bit data only