Преобразование модели AutoCAD в матрицу точек / объемов с массовой плотностью, указанной в каждом месте

Я физик-экспериментатор (аспирант), который пытается взять модель AutoCAD эксперимента, который я построил, и найти гравитационный потенциал всего инструмента в заданном объеме. Прежде чем найти потенциал, я пытаюсь составить карту плотности массы в каждой точке модели.

Важно то, что у меня уже есть модель, и, в конце концов, у меня будет что-то, что говорит: «В (x, y, z) значение равно d». Если это сумасшедший файл csv, массив numpy, лист Excel или ... что-то еще, я буду счастлив.

Вот что я до сих пор придумал:

Шаг 1. Я кодирую файл AutoCAD цветом, чтобы цвет ассоциировался с материалом.

Шаг 2: Я отправляю новый рисунок / модель на слайсер (сделанный для 3D-печати). Это берет мой трехмерный объект и превращает его в двухмерные объекты, расположенные на равных расстояниях (в направлении z) ... но затем все это выводится как g-код. Но эй! G-код - это способ сообщить двигателю, как двигаться.

Шаг 3: Это «сложная часть» и суть вопроса. Я думаю, что беру этот g-код, который, по сути, представляет собой просто набор инструкций о том, как перемещать сопло и использовать его для заполнения массива numpy. В основном у меня есть 3D-массив, каждый уровень соответствует одной позиции в z, а левая сетка - это моя плоскость x-y. Он считывает, какой цвет куда наносится, следует за соплом и помещает эту массу в эти точки. Он знает массу благодаря цвету. Он следует по пути, анализируя g-код.

Когда это будет сделано с этим уровнем, он перейдет к следующей сетке и повторится.

Это звучит безумно? А еще лучше, кажется ли это правдоподобным? Или, может быть, у кого-то есть более разумный способ думать об этом.

Даже если вы просто прочитали все это, спасибо. Шутки в сторону.


person Adam Archibald    schedule 15.03.2017    source источник
comment
Не безумно, но весьма нетривиально. И как в настоящее время структурирован, не очень хорошо подходит как вопрос для stackoverflow.   -  person Stephen Rauch    schedule 16.03.2017
comment
Это очень разумно и может быть сделано - я бы сказал, что это нетривиально - просто немного поработать, и все. Чтобы свести к минимуму отрицательную обратную связь, может быть лучше отредактировать свой вопрос следующим образом: Можно ли преобразовать g-код для получения двумерного пути / декартовых координат? Если да, то как? Это то, что я пытаюсь сделать ... и то, что я сделал, и т. Д ..., поскольку все остальное только способствует контексту.   -  person jrd1    schedule 17.03.2017


Ответы (1)


Это звучит безумно? А еще лучше, кажется ли это правдоподобным?

Это очень разумно и правдоподобно. Использование g-кода могло бы сделать это, но для этого потребовался бы интерпретатор g-кода, который мог бы отображать инструкции в 2D-путь. (Не в 3D, поскольку вы упомянули, что снимаете фиксированные z-срезы.) Это может быть проблематично, но, если вы его найдете, это может сработать, но может потребовать некоторых манипуляций с анализатором. Есть несколько из них на разных языках, которые могут быть полезны.

ПРЕДПОЛОЖЕНИЕ

Судя по тому, что вы описываете, это похоже на МРТ-сканирование объекта и попытку определить его составной массовый профиль по заданной оси. В этом случае, в отличие от МРТ, у вас есть несколько цветов, поэтому которые можно использовать в ваших интересах при выборе / идентификации региона.

Даже если вы использовали интерпретатор G-кода, он воспроизвел бы изображение, площадь которого вам все равно придется вычислить, поэтому, учитывая это и учитывая, что вы стремитесь определить и классифицировать состав материала по пути (в что путь определяет границу конкретного материала, который имеет уникальный цвет), может быть несколько способов приблизиться к этому, не прибегая к g-коду:

1) Если цвета вашего материала легко (или разумно) различимы, вы можете создать цветовую маску, которая будет количественно определять занимаемую площадь, по которой вы затем сможете определить массу.

То есть, если вы сделаете фотографию среза, загрузите изображение в массив numpy, а затем выполните поиск определенного значения (например, красного), вы можете определить область области. Затем вы применяете маску к вашему массиву. После этого вы подсчитываете занятые элементы в вашем массиве, а затем делите их на размер массива (то есть строки на столбцы), что даст вам относительную занятую площадь. Поскольку вам известна масса материала и существует постоянная толщина по оси Z, это даст вам относительную массу. Пример цветовой маскировки с использованием только numpy показан здесь: http://scikit-image.org/docs/dev/user_guide/numpy_images.html

Таким образом, давайте определим пример, аналогичный вашей проблеме - допустим, у нас есть изображение красной капусты, и мы хотим знать, какая часть изображения содержит красные / пурпурные пиксели.

Красная капуста

Чтобы упростить себе жизнь, мы установим белый цвет для любого пикселя выше определенного порога (RGB: 255 255 255), а затем посчитаем, сколько там небелых пикселей:

from copy import deepcopy
import numpy as np
import matplotlib.pyplot as plt


def plot_image(fname, color=128, replacement=(255, 255, 255), plot=False):
    # 128 is a reasonable guess since most of the pixels in the image that have the
    # purplish hue, have RGB's above this value.
    data = imread(fname)
    image_data = deepcopy(data)  # copy the original data (for later use if need be)
    mask = image_data[:, :, 0] < color  # apply the color mask over the image data
    image_data[mask] = np.array(replacement)  # replace the match
    if plot:
        plt.imshow(image_data)
        plt.show()
    return data, image_data

data, image_data = plot_image('cabbage.jpg')  # load the image, and apply the mask

# Find the locations of all the pixels that are non-white (i.e. 255)
# This returns 3 arrays of the same size)
indices = np.where(image_data != 255)

# Now, calculate the area: in this case, ~ 62.04 %
effective_area = indices[0].size / float(data.size)

Выбранный рассматриваемый регион показан здесь ниже:  Выбор пикселей красной капусты

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

Кроме того, зная эффективную площадь и физические размеры, вы можете хорошо оценить реальную занимаемую площадь. Чтобы получить лучшие результаты, измените значение цветового порога (т. Е. Цвет). В вашем реальном примере, поскольку вы знаете цвет, выполните поиск в диапазоне пикселей вокруг этого значения (чтобы компенсировать проблемы с шумом и освещением).

Вышеупомянутый метод немного груб, но эффективен, и, возможно, стоит изучить его использование в тандеме с обнаружением краев, так как это может помочь улучшить идентификацию области и выбор области. (Обратите внимание, что это не всегда строго верно!) Также может быть полезна деконволюция цвета:

person jrd1    schedule 17.03.2017