0

我正在尝试用 plotly 对图像的所有像素的 RGB 分量进行 3d 绘制(每个像素都是 3d 空间中的一个点,其中轴是 R、G 和 B),同时让每个像素都用它的颜色

示例图

我使用了以下方法,它确实适用于少量像素:

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是一个 numpy 像素数组(形状(1000, 3))。

但是越来越多的跟踪几乎使我的浏览器崩溃了 1000 点,甚至没有超过这个值。肯定有更好的方法吗?

我的目标是让这项工作获得 100k 到 1M 点。对于减少数量的颜色(例如在 K-Means 聚类后将点分组为相同颜色的轨迹),这非常有效。

我考虑过反过来做,并根据现有颜色绘制一条轨迹,以避免不同轨迹中有多个重叠点,但这会导致 16M (256^3) 个可能的轨迹,因此可能也不合适。

4

1 回答 1

0

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)),
        ),
    )
]

这更漂亮,可以在几秒钟内在我的电脑上显示多达 500k 点。超过此阈值,将达到内存限制。

于 2019-03-19T15:24:32.843 回答