0

我是一名实验物理学家(研究生),正在尝试使用我建立的实验的 AutoCAD 模型,并从整个仪器中找到指定体积内的引力势。在我发现潜力之前,我正在尝试绘制模型中每个点的质量密度图。

重要的是我已经有了一个模型,最后我会有一个写着“在 (x,y,z) 处的值为 d”的东西。如果那是一个疯狂的 csv 文件、一个 numpy 数组、一个 excel 表,或者......无论如何,我会很高兴。

到目前为止,这是我想出的:

第 1 步:我对 AutoCAD 文件进行颜色编码,以便颜色与材料相关联。

第 2 步:我将新图纸/模型发送到切片机(用于 3D 打印)。这需要我的 3D 对象并将其转换为等距(在 z 方向上)的 2d 对象......但是这一切都作为 g 代码输出。但是,嘿!G 代码是一种告诉电机如何移动的方式。

第 3 步:这是“难点”,也是这个问题的重点。我在想我采用那个 g 代码,它本质上只是一组关于如何移动喷嘴并使用它来填充 numpy 数组的指令。基本上我有3D数组,每一层对应z中的一个位置,左边的网格是我的xy平面。它读取放置在哪里的颜色,并跟随喷嘴并将该质量放入这些点。它知道质量是因为颜色。它通过解析 g 代码来遵循路径。

完成该级别后,它会移动到下一个网格并重复。

这听起来很疯狂吗?更好的是,这听起来合理吗?或者,也许有人对此有更聪明的思考方式。

即使您只是阅读了所有内容,也谢谢您。严重地。

4

1 回答 1

0

这听起来很疯狂吗?更好的是,这听起来合理吗?

这是非常合理和合理的。使用 g 代码可以做到这一点,但它需要一个 g 代码解释器,可以将指令映射到 2D 路径。(不是 3D,因为您提到您正在使用固定的 z 切片。)这可能是有问题的,但是,如果您找到一个,它可以工作,但可能需要一些解析器操作。其中有多种语言版本,可能很有用。

建议

根据您的描述,它类似于对物体进行 MRI 扫描,并试图确定其沿给定轴的组成质量分布。在这种情况下,与 MRI 不同,您有多种颜色,因此可以在区域选择/识别中发挥您的优势。

即使您使用 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包含已被屏蔽的像素信息,并将提供每个占用(即非白色)像素出现的坐标(尽管在像素空间中)。 当然,问题在于这些是像素坐标而不是物理坐标。但是,由于您知道物理尺寸,因此很容易推断出这些数量。

此外,在已知有效面积和物理尺寸知识的情况下,您可以很好地估计实际占用的面积。要获得更好的结果,请调整颜色阈值(即颜色)的值。在您的实际示例中,由于您知道颜色,因此请在该值周围的像素范围内搜索(以抵消噪声和照明问题)。

上述方法有点粗略——但很有效——而且,将它与边缘检测结合使用可能值得探索,因为这有助于改进区域识别和区域选择。(请注意,这并不总是正确的!)此外,颜色反卷积可能很有用:http ://scikit-image.org/docs/dev/auto_examples/color_exposure/plot_ihc_color_separation.html#sphx-glr-auto-examples-color -exposure-plot-ihc-color-separation-py

这样做的缺点是分析需要高质量的图像,良好的照明;而且,最重要的是,您可能会丢失一些更精细的边缘细节,这会影响您的质量。

2)无需借助相机工作,并且鉴于您拥有 AutoCAD 模型,除了上述规定的方法之外,您还可以使用该模型和软件本身。

由于您已对模型中的每种材料进行了不同的着色,因此您可以使用 AutoCAD 的切片工具,并且可以执行类似于第一种方法建议的物理操作:对模型进行切片,并对切片拍照以暴露表面。然后,使用上面描述的颜色掩蔽/边缘检测/通过颜色选择确定区域的类似方法,您应该获得更好且(可以说)非常准确的结果。

不利的一面是,您还受到所使用图像质量的限制。但是,由于它是软件,这应该不是什么大问题,而且您可以获得极高的准确性 - 接近其实际结果。

改进这些结果的最后一个建议是,沿着每个后续切片共享的特定方向矢量对 AutoCAD 模型进行大量随机薄切片,导出每个暴露的表面,以上述方式分析每个图像,然后将这些结果收集到给你一个类似蒙特卡洛的和统计上可量化的质量测定(校正由于沿一个给定轴切片引起的几何效应)。

于 2017-03-17T03:05:58.023 回答