2013-01-22 27 views
52

Görüntülerin fourier dönüşümlerini gerçekleştirmek için daha önce bulduğum bir gönderiyi kullanarak Python görüntü kitaplığını (PIL) kullanarak bazı görüntü işleme işlemleri yaptım ve kaydetme işlevinin çalışmaya başlayamıyorum. Bütün kod çalışıyor ama sadece alışkanlık çıkan görüntü kaydetmek:Görüntüyü PIL ile nasıl kaydedebilirim?

save_handler = SAVE[string.upper(format)] # unknown format 
    KeyError: '.BMP' 

nasıl piton PIL ile bir görüntüyü kaydedebilirsiniz: Ben olsun

from PIL import Image 
import numpy as np 

i = Image.open("C:/Users/User/Desktop/mesh.bmp") 
i = i.convert("L") 
a = np.asarray(i) 
b = np.abs(np.fft.rfft2(a)) 
j = Image.fromarray(b) 
j.save("C:/Users/User/Desktop/mesh_trans",".bmp") 

hata şudur?

cevap

67

dosya uzantısıyla ilgili hata ya (noktasız) bmp kullanın ele veya pas olmuştur zaten uzantı ile çıktı adı. Artık bir tamsayı görüntü olarak kaydedilecek frekans etki alanındaki verilerinizi düzgün bir şekilde değiştirmeniz gereken hatayı işlemek için PIL, bpm olarak kaydedilecek float verilerini kabul etmediğinizi söylüyor. Bu eski olduğunu biliyoruz

import sys 
import numpy 
from PIL import Image 

img = Image.open(sys.argv[1]).convert('L') 

im = numpy.array(img) 
fft_mag = numpy.abs(numpy.fft.fftshift(numpy.fft.fft2(im))) 

visual = numpy.log(fft_mag) 
visual = (visual - visual.min())/(visual.max() - visual.min()) 

result = Image.fromarray((visual * 255).astype(numpy.uint8)) 
result.save('out.bmp') 
+1

hey çok teşekkürler. şimdi mükemmel çalışıyor! şimdi tek yapmam gereken tüm adımları anlamak ama bu çok kötü olmayacak. – user1999274

+0

@ user1999274 yardım için çok teşekkür ederim, büyük fark, daha sonra kullanmanın noktasını göremediğimden, "rfft2" yerine "fft2" kullanımıdır. Geri kalan sadece kozmetiktir, yani Fourier dönüşümünü bir log faktörü uygulayamadan düzgün bir şekilde görselleştiremezsiniz. Daha sonra normalleştirme, dönüşüm için [0, 255] aralığına basit işleri tutmaktır. – mmgp

+0

'visual = (visual - visual.min())/(visual.max() - visual.min())' 'visual' varyansı var ise (olası değil ama yakalanmaya değer) –

5

.bmp kodundan önce . kaldırmayı deneyin (BMP beklendiği gibi değil). Hatadan görebildiğiniz gibi, save_handler, sağladığınız format üst kasasıdır ve ardından SAVE numaralı telefondan bir eşleşme arar. Ancak, bu nesnede karşılık gelen anahtar BMP (.BMP yerine) 'dir.

PIL hakkında pek bir şey bilmiyorum, ancak etraftaki bazı hızlı aramalardan görüntünün mode ile ilgili bir sorun olduğu anlaşılıyor. için j tanımını değiştirme:

j = Image.fromarray(b, mode='RGB') 

ancak PIL çok az bilgiye sahip olduğunu, dolayısıyla ben s olarak @ mmgp en çözümünü kullanarak öneririm (benim için çalışmaya görünüyordu/o açıkça ne yaptıklarını biliyor:)). mode türleri için this sayfasını kullandım - umarım sizin için çalışacak seçimlerden biri.

+0

.bmp'yi bmp lehine çıkarmaya çalıştım ve hala çalışmıyordu. Şimdi aldığım hata: IOError: BMP olarak F modunu yazamıyor. PIL sayfaları için belgelerini kontrol ettim ve bu yüzden .bmp kullanmak için söylendi genel olarak hala neden çalışmadığı hiçbir fikrim yok. – user1999274

+0

@ user1999274 Benim için işe yarayacak bir güncelleme yayınladı (detaysızlıktan dolayı özür dilerim - birlikte devam ederken :)). – RocketDonkey

+0

@RocketDonkey, bundan biraz daha akıllıdır, çünkü Fourier dönüşümü sonuçlarını RGB renk uzayına dönüştürmek anlamsız bir görüntü verecektir. Artık bir istisnayı arttırmadığı için sonucun doğru olduğu anlamına gelmez. – mmgp

18

Sadece PIL uzantısından filetype izin gerekir, yani kullanım:

j.save("C:/Users/User/Desktop/mesh_trans.bmp") 
+0

+1, daha iyi bir seçenek gibi görünüyor :) – RocketDonkey

+0

Giriş için teşekkürler. Ancak, kaydetme işlevinin yukarıda önerdiğiniz gibi filetype almasını sağlamaya çalıştığımda aşağıdaki hatayı alıyorum: IOError: BMP olarak F moduna yazamıyor. herhangi bir tavsiye? – user1999274

+0

Evet, diziyi float yerine "numpy.uint8" dtype biçimine dönüştürmelisiniz. – wim

3

ama buldum: İşte

uygun görselleştirme için dönüşüm yapmak için ( fftshift ve yerine numpy.asarray ait numpy.array kullanmak gibi, diğer küçük değişikliklerle) bir öneridir Dosyayı open(fp, 'w') kullanarak açıp dosyayı kaydetmeniz işe yarayacak. Örn:

j.save(open(fp, 'w')) 

fp tabii dosya yolu, varlık. (Yastık ile birlikte)