Отображение значений RGB изображений с помощью matplotlob - PullRequest
0 голосов
/ 23 января 2020

(обновление) Многие видели это. Прежде всего, я хочу извиниться, я впервые спрашиваю об этом. Не хотел вызывать путаницу. Итак, что я пытаюсь сделать, вместо того, чтобы получить график, на котором значения RGB выстроены в единственную линию, я хочу, чтобы значения были распределены по трехмерной плоскости. Мне сложно описать. Я опубликую изображение другого графика, созданного моим кодом, и того, что напоминает то, что я бы предпочел.

График, созданный на основе другого изображения, которое использовалось в качестве входных данных. Обратите внимание, как он разбросан по оси z, но не по x и y

Пример того, что я хотел бы, чтобы мой график в целом напоминал. Точки разбросаны по пространству. (Не моя программа, будет ссылка на оригинальный код)

mplot3d учебник - источник для примера graph

Извините за приставание. Работал над небольшим заданием для комп. Sci. класс, в котором программа получает изображение пользователя, а затем отображает его на трехмерном графике. Программа работает, и график представлен, но мне пришлось изменить то, как выглядит график, из-за разборчивости массива для того же вида. Вот как выглядит график тестового изображения:

Graph produced by program. Note how the lines are straight one dimensional lines instead of being more 2d and spread out.

Не поймите меня неправильно, у меня есть общее представление о том, как это исправить , но я псевдокодирую свою задницу, чтобы попытаться понять это.

В любом случае, вот мой код. модуль finfot служит сборщиком информации об изображении и является вторым фрагментом кода.

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
import finfot3


fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

b_val = finfot3.bluev
r_val = finfot3.redv
g_val = finfot3.greenv2
widthv = (finfot3.IM_Wid)**2

zv2array = np.array(g_val)
zvarray = np.array(r_val)
zv3array = np.array(b_val)
widtharray = np.array(range(widthv))

X = widtharray
Y = widtharray
Z = zvarray

X2 = widtharray
Y2 = widtharray
Z2 = zv2array

X3 = widtharray
Y3 = widtharray
Z3 = zv3array

ax.scatter(X,Y,Z, c="r", s=1)
ax.scatter(X2, Y2, Z2, c="g", s=1)
ax.scatter(X3, Y3, Z3, c="b", s=1)

ax.set_xlabel('pixel #')
ax.set_ylabel('pixel #')
ax.set_zlabel('Value of pixel w/ color')

plt.show()

------------------ ----------------- файл finfot -----------------------------

from PIL import Image
import numpy as np

user_inp = input("Please type in the title of your image file with the correct extension. i.e. jpg., png. Make sure image file is sqaure and is in same folder as program files.")
im = Image.open(user_inp)
pix_val_array = []
pvflat = []
for y in range(im.size[1]):
    for x in range(im.size[0]):
        pix_val_array.append((im.getpixel((x, y))))

for y in pix_val_array:
    for z in y:
        pvflat.append(z)

pvflat2 = pvflat[1:]
pvflat3 = pvflat[2:]

redv = pvflat[::3]
greenv2 = pvflat2[::3]
bluev = pvflat3[::3]


IM_Wid = im.size[0]

print(IM_Wid**2)
print(len(redv))
print(len(greenv2))
print(len(bluev))
...