Plotly Scatter3d пикселей вдоль компонентов RGB - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь построить 3D-компоненты RGB для всех пикселей изображения с помощью графика (каждый пиксель - это точка в трехмерном пространстве, где оси - это R, G и B), в то время как имееткаждый пиксель окрашивается в свой цвет :

Example plot

Я использовал следующий подход, который отлично работает с небольшим количеством пикселей:

import plotly.offline as pyo
import plotly.graph_objs as go
import numpy as np

pyo.init_notebook_mode()

data = list()
# for each pixel
for pixel in image_to_plot:
    # add trace as follows:
    data.append(
        go.Scatter3d(
            # only one point
            x=[pixel[0]],
            y=[pixel[1]],
            z=[pixel[2]],
            # set its color
            mode='markers',
            marker=dict(size=2, color='rgb('+', '.join(pixel.astype(str))+')'),
        )
    )

layout = dict(scene=dict(xaxis=dict(title='R'), yaxis=dict(title='G'), zaxis=dict(title='B')), showlegend=False)
pyo.iplot({'data': data, 'layout': layout}, filename='so_example')

, где image_to_plot - это массив пикселей (форма (1000, 3)).

Но растущее число трассировок почти приводит к краху моего браузера с 1000 точками и не даетдаже сделать выше этого. Конечно, есть лучший подход?

Моя цель состоит в том, чтобы получить эту работу с 100k до 1M очков.Для уменьшенного количества цветов (например, группирование точек в кривые одного и того же цвета после кластеризации K-Means) это работает отлично.

Я думал об этом наоборот и построил график для каждой существующейцвет, чтобы избежать нескольких перекрывающихся точек на разных трассах, но это приводит к 16M (256 ^ 3) возможных трасс, поэтому, вероятно, также не подходит.

1 Ответ

0 голосов
/ 19 марта 2019

Словарь marker может взять список для своего ключа color и применить его поэлементно, так что это разрешено:

# Instead of this in a for-loop:
x=[pixel[0]]
color='rgb('+', '.join(pixel.astype(str))+')'

# Do this:
x=image_to_plot[:, 0]
color=list(map(lambda e: 'rgb('+', '.join(e.astype(str))+')', image_to_plot))

Полное решение для переменной data:

data = [
    go.Scatter3d(
        x=image_to_plot[:, 0],
        y=image_to_plot[:, 1],
        z=image_to_plot[:, 2],
        mode='markers',
        marker=dict(
            size=2,
            color=list(map(lambda e: 'rgb('+', '.join(e.astype(str))+')', image_to_plot)),
        ),
    )
]

Это намного красивее и может показать до 500 тыс. Баллов за несколько секунд на моем компьютере.При превышении этого порога достигаются пределы памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...