2015-05-06 12 views
8

Python'u kullanarak (this matlab question modeline benzer) Gradient Vector Field görüntüsünü elde etmeye çalışıyorum.Python'da Resim Eğrili Vektör Alanı

Bu orijinal resimdir: http:/ /dcc.fceia.unr.edu.ar/~rbaravalle/gradient/test.png

İşte benim kodudur: http://dcc.fceia.unr.edu.ar/~rbaravalle/gradient/result.png

sorun vektörler yanlış gibi görünüyor olmasıdır:

import numpy as np 
import matplotlib.pyplot as plt 
import Image 
from PIL import ImageFilter 

I = Image.open('test.png').transpose(Image.FLIP_TOP_BOTTOM) 
I = I.filter(ImageFilter.BLUR) 
p = np.asarray(I) 
w,h = I.size 
y, x = np.mgrid[0:h:500j, 0:w:500j] 

dy, dx = np.gradient(p) 
skip = (slice(None, None, 3), slice(None, None, 3)) 

fig, ax = plt.subplots() 
im = ax.imshow(I, extent=[x.min(), x.max(), y.min(), y.max()]) 
ax.quiver(x[skip], y[skip], dx[skip], dy[skip]) 

ax.set(aspect=1, title='Quiver Plot') 
plt.show() 

Bu sonucudur.

http://dcc.fceia.unr.edu.ar/~rbaravalle/gradient/result2.png

Neden vektörlerin bazı beklendiği gibi merkeze işaret yapmak, diğerleri yapmadığı halde: Görüntünün yakınlaştırmak yine bu husus daha açık olur?

Belki de np.gradient numaralı aramanın sonucuyla ilgili bir sorun var mı?

cevap

7

Bence garip sonuçlarınız en azından kısmen, p uint8 tipindedir. Uyuşuk fark bile, bu dtipin bir dizisi için açıkça yanlış değerlerle sonuçlanır. p tanımını aşağıdakiyle değiştirerek imzalanmış tam sayıya dönüştürürseniz: p = np.asarray(I).astype(int8) sonra fark sonuçları doğrudur. Aşağıdaki kod

import numpy as np 
import matplotlib.pyplot as plt 
import Image 
from PIL import ImageFilter 

I = Image.open('./test.png') 
I = I.filter(ImageFilter.BLUR) 
p = np.asarray(I).astype('int8') 
w,h = I.size 
x, y = np.mgrid[0:h:500j, 0:w:500j] 

dy, dx = np.gradient(p) 
skip = (slice(None, None, 3), slice(None, None, 3)) 

fig, ax = plt.subplots() 
im = ax.imshow(I.transpose(Image.FLIP_TOP_BOTTOM), 
       extent=[x.min(), x.max(), y.min(), y.max()]) 
plt.colorbar(im) 
ax.quiver(x[skip], y[skip], dx[skip].T, dy[skip].T) 

ax.set(aspect=1, title='Quiver Plot') 
plt.show() 

Bu

aşağıdaki verir, makul bir alanda nasıl göründüğünü bana verir:

Solution

ve beklediğiniz gibi bu görünüyor yakından

enter image description here

+0

Harika yakalama, '.astype ('int8')' aynı zamanda çalışır. Negatif gradyanlarla (negatif değerlerin pozitif değerlere eklenmesiyle) problemler yaratan 'u' (imzasız) 'dır. – fhdrsdg

+0

Çözüm budur, çok teşekkür ederim! .Genel olarak "transpoze" çağrısını im = ax.imshow'a taşıdım (I), ieim = ax.imshow (I.transpose (Image.FLIP_TOP_BOTTOM)), ve sonra görüntünüzle tam olarak aynı sonucu aldım. İsterseniz, kişilerinizi doğrudan kodunuzu kullanabilmeleri için değiştirin. Ayrıca, np.int8 kullanmanın muhtemelen floattan daha iyi olduğunu kabul ediyorum. –

+0

Güncelleme: Degradeler üzerinde bir gauss filtresi kullanılarak "daha yumuşak" bir versiyon elde edilebilir. Örneğin: http://dcc.fceia.unr.edu.ar/~rbaravalle/gradient/resultSoft.png Kod sonuçları: http://dcc.fceia.unr.edu.ar/~rbaravalle/gradient/test3. py –