- 原数据(可能是)十六进制,每个十六进制数代表一个字节(八位二进制数,取值范围0-255);
- pgm文件是b’xxx’后的二进制文件(打开后乱码);
- 以ord(yyy)读取每一个字节。
数据集:DDSM
pgm转png代码:
def convert_pgm_P5(in_path, out_path):
"""
将pgm文件转换成其它图像格式
读取二进制文件,先读取幻数,再读取宽和高,以及最大值
:param in_path: 输入pgm文件路径
:param out_path: 输出文件路径
"""
if not is_pgm_file(in_path):
raise Exception("%s 不是一个PGM文件" % in_path)
with open(in_path, 'rb') as f:
# 读取两个字节 - 幻数,并解码成字符串
magic_number = f.readline().strip().decode('utf-8')
if not operator.eq(magic_number, "P5"):
raise Exception("该图像有误")
# 读取高和宽
width, height = f.readline().strip().decode('utf-8').split(' ')
width = int(width)
height = int(height)
print('height, width---', height, width)
# 读取最大值
maxval = f.readline().strip()
# 每次读取灰度值的字节数
if int(maxval) < 256:
one_reading = 1
else:
one_reading = 2
# 创建空白图像,大小为(行,列)=(height, width)
img = np.zeros((height, width))
img[:, :] = [[ord(f.read(one_reading)) for j in range(width)] for i in range(height)]
print('type(f.read(one_reading))---', type(f.read(one_reading)))
cv2.imwrite(out_path, img)
print('%s save ok' % out_path)