Python: начертайте 3D форма върху 2D изображение

Опитвам се да начертая 3D форма с 2D изображение, насложено върху xy-равнината. Току-що започнах да работя с Python, така че това е по-голямо предизвикателство, отколкото трябва да бъде.

Този въпрос тук се отнася до това, което се опитвам да направя: Наслагване на изображение в 3d графика с помощта на python. Но когато стартирам предоставения код, получавам следната грешка:

File "test.py", line 13, in <module>
ax.plot_surface(x, y, 10, rstride=5, cstride=5, facecolors=img)
File "/usr/lib64/python2.7/site-packages/mpl_toolkits/mplot3d/axes3d.py", line 663, in plot_surface
rows, cols = Z.shape
AttributeError: 'int' object has no attribute 'shape'

Изображението, което използвам, се съхранява в същата папка като моя „test.py“. Въпросът, който посочих по-горе, използва изображение от get_sample_data, но ако го редактирам, за да използва моето изображение, кодът е както следва:

from pylab import *
from mpl_toolkits.mplot3d import Axes3D
from matplotlib._png import read_png

img = read_png('milkyway.png')

x, y = ogrid[0:img.shape[0], 0:img.shape[1]]
ax = gca(projection='3d')
ax.plot_surface(x, y, 10, rstride=5, cstride=5, facecolors=img)
show()

Получавам същата грешка, независимо дали използвам get_sample_data или собственото си изображение. Някакви предложения какво мога да променя? Благодаря!


person user2569840    schedule 10.07.2013    source източник
comment
Можете ли да надстроите вашата версия на mpl? Този код работи правилно с по-новите версии на библиотеката.   -  person tacaswell    schedule 11.07.2013
comment
Опасявам се, че не, правя това на работа (университетски компютри).   -  person user2569840    schedule 11.07.2013
comment

Защо тези две изображения имат еднаква ентропия?

Тези изображения са създадени в MATLAB, както следва:

N = 50;
Z1 = randi([0 1],N);
Z2 = zeros(N);
Z2(1:2:N,1:2:N) = 1;
Z2(2:2:N,2:2:N) = 1;
subplot(1,2,1)
imshow(Z1,'InitialMagnification',800)
subplot(1,2,2)
imshow(Z2,'InitialMagnification',800);

И тяхната "ентропия" се изчислява като:

entropy(Z1)
entropy(Z2)

което води до 1,0000.

В помощта се казва, че ентропията е равна на -sum(p.*log2(p)), където p е броячът, върнат от imshist. Трудно ми е да повярвам, че тези снимки имат същото „количество произволност“, тъй като виждаме, че едната от тях е силно подредена, докато другата е напълно произволна. Какво от това?

  -  person tacaswell    schedule 11.07.2013


Отговори (2)


Грешката изглежда е, защото plot_surface очаква масив за аргумента 'Z', но сте му дали цяло число 10. (по този начин обектът за грешка 'int' няма атрибут 'shape')

person Luke    schedule 10.07.2013
comment
Искам да поставя изображението на z=0, така че мога ли да направя z да бъде масив от 0? Ако е така и трябва да е със същия размер като x и y, мога ли да напиша: z = np.zeros(size(x))? - person user2569840; 11.07.2013
comment
Разгледайте документацията на API: matplotlib.org/mpl_toolkits/ mplot3d/ Всеки аргумент е 2D масив, предоставящ координатите x, y или z на мрежа от точки. - person Luke; 11.07.2013
comment
@user2569840 Това е правилната идея, но трябва да е z = np.zeros(x.shape) - person tacaswell; 11.07.2013

Не зареждате вашето изображение правилно - read_png() се нуждае от файлов обект като вход, а не от път към файл. Опитайте тази:

 f = open('milkyway.png','r')
 img = read_png(f)
person ali_m    schedule 10.07.2013
comment
Добре, как изглежда img? Определено ли е редове x колони x RGB(A) масив? Можете ли просто да го imshow? - person ali_m; 11.07.2013
comment
Да, imshow го показва добре. Номерът сега е да го превърнете в 3D сюжет. - person user2569840; 11.07.2013
comment
Сега x и y просто трябва да бъдат 2D масиви със същата форма като изображението. В моята версия на matplotlib (1.2.1), plot_surface изглежда приема целочислен аргумент за z, но ако това не работи, трябва също да опитате да му предадете масив със същата форма като x и y: z = np.zeros_like(x). - person ali_m; 11.07.2013