pgm 일반 ascii 형식 (P2) 용 파이썬 이미징 라이브러리에 필터를 쓰려면 어떻게해야합니까? 문제는 기본 PIL 필터가 픽셀 당 일정한 바이트 수를 가정한다는 것입니다.일반 pgm 형식의 PIL 이미지 필터를 작성하는 방법은 무엇입니까?
내 목표는 Image.open()으로 feep.pgm을 여는 것입니다. http://netpbm.sourceforge.net/doc/pgm.html 이하를 참조하십시오.
대체 솔루션은 PIL 및 모든 주요 그래픽 프로그램에서 지원하는 다른 잘 문서화 된 ASCII 회색 음영 형식을 찾는 것입니다. 어떤 제안?
feep.pgm :
P2
# feep.pgm
24 7
15
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 3 3 3 3 0 0 7 7 7 7 0 0 11 11 11 11 0 0 15 15 15 15 0
0 3 0 0 0 0 0 7 0 0 0 0 0 11 0 0 0 0 0 15 0 0 15 0
0 3 3 3 0 0 0 7 7 7 0 0 0 11 11 11 0 0 0 15 15 15 15 0
0 3 0 0 0 0 0 7 0 0 0 0 0 11 0 0 0 0 0 15 0 0 0 0
0 3 0 0 0 0 0 7 7 7 7 0 0 11 11 11 11 0 0 15 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
편집 : 답변 감사합니다, 그것은 하지만 ... 작동 내가 Image.open를 사용하는 솔루션이 필요합니다(). 파이썬 프로그램의 대부분은 그래픽 조작 (구글 : 파이썬 이미지 열기)을 위해 PIL을 사용합니다. 따라서 PIL에 필터를 등록 할 수 있어야합니다. 그런 다음 PIL을 사용하는 모든 소프트웨어를 사용할 수 있습니다. 나는 이제 대부분 scipy, pylab 등의 의존적 인 프로그램을 생각합니다.
편집 좋아, 이제 알았어. 아래 래퍼는 pgm2pil.py입니다.
import Image
import numpy
def pgm2pil(filename):
try:
inFile = open(filename)
header = None
size = None
maxGray = None
data = []
for line in inFile:
stripped = line.strip()
if stripped[0] == '#':
continue
elif header == None:
if stripped != 'P2': return None
header = stripped
elif size == None:
size = map(int, stripped.split())
elif maxGray == None:
maxGray = int(stripped)
else:
for item in stripped.split():
data.append(int(item.strip()))
data = numpy.reshape(data, (size[1],size[0]))/float(maxGray)*255
return numpy.flipud(data)
except:
pass
return None
def imageOpenWrapper(fname):
pgm = pgm2pil(fname)
if pgm is not None:
return Image.fromarray(pgm)
return origImageOpen(fname)
origImageOpen = Image.open
Image.open = imageOpenWrapper
misha의 답변에는 약간의 업그레이드가 있습니다. 결코 끝나지 않는 루프를 막기 위해 Image.open을 저장해야합니다. > "FOO"와 lena.pgm은 는 IS - pgm2pil가 pgm2pil 호출 없음을 반환하는 pgm2pil 없음 래퍼 전화를 ... 반환하면 다음
테스트 기능 (feep_false.pgm 조작 된 PGM의 예 : "P2"입니다 이미지 파일) :import pgm2pil
import pylab
try:
pylab.imread('feep_false.pgm')
except IOError:
pass
else:
raise ValueError("feep_false should fail")
pylab.subplot(2,1,1)
a = pylab.imread('feep.pgm')
pylab.imshow(a)
pylab.subplot(2,1,2)
b = pylab.imread('lena.png')
pylab.imshow(b)
pylab.show()
감사합니다. 하지만, 왜 numpy.flipud (데이터)를 반환합니까? 데이터 만 반환해야합니다. – user1245262
오래 전이 작업을했을 때 ... 이미지가 직교 좌표계 (y 축 반전)에 있지 않다는 것입니다. IMHO 이미지는 플립이없는 데카르트 시스템에 있어야합니다 (또는 플립과 함께, 나는 어떤 방법으로 기억이 나지 않습니다). 위의 그림에서 imread와 imshow를 사용할 때 이미지가 올바르게 표시됩니다. – Juha
아 ... 그건 의미가 있습니다. 나는 그 생각을 했어야했다. 다시 한번 감사드립니다. – user1245262