c++ vtk实现矢状面

时间: 2023-05-30 20:07:15 浏览: 31
VTK是一个用于可视化的开源软件工具包,它可以用来实现各种类型的可视化应用程序。在VTK中,可以通过使用vtkImageReslice和vtkImageActor等类来实现矢状面的可视化。 以下是实现矢状面的步骤: 1. 加载数据:使用vtkDICOMImageReader或vtkStructuredPointsReader等类来加载数据。 2. 创建vtkImageReslice对象:vtkImageReslice对象用于将数据进行重新采样和旋转,以便在矢状面上进行可视化。 3. 设置vtkImageReslice对象的输入、输出和插值方式等参数。 4. 创建vtkImageActor对象:vtkImageActor对象用于将vtkImageData对象渲染为图像。 5. 创建vtkRenderer对象:vtkRenderer对象用于将vtkImageActor对象添加到渲染器中,并设置渲染器的背景颜色和视角等参数。 6. 创建vtkRenderWindow对象:vtkRenderWindow对象用于显示渲染器中的图像,并设置窗口大小和标题等参数。 7. 运行程序:将vtkRenderWindow对象显示到屏幕上,并实现交互操作。 下面是一个简单的示例代码: ```python import vtk # 加载数据 reader = vtk.vtkDICOMImageReader() reader.SetDirectoryName("path/to/dicom/folder") reader.Update() # 创建vtkImageReslice对象 reslice = vtk.vtkImageReslice() reslice.SetInputConnection(reader.GetOutputPort()) reslice.SetOutputDimensionality(2) reslice.SetOutputExtent(0, 511, 0, 511, 0, 0) reslice.SetResliceAxesDirectionCosines(1, 0, 0, 0, 0, -1, 0, 1, 0) reslice.SetInterpolationModeToLinear() # 创建vtkImageActor对象 actor = vtk.vtkImageActor() actor.SetInputData(reslice.GetOutput()) # 创建vtkRenderer对象 renderer = vtk.vtkRenderer() renderer.AddActor(actor) renderer.SetBackground(0.1, 0.2, 0.4) renderer.ResetCamera() # 创建vtkRenderWindow对象 renderWindow = vtk.vtkRenderWindow() renderWindow.AddRenderer(renderer) renderWindow.SetSize(500, 500) renderWindow.SetWindowName("Sagittal View") # 运行程序 interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(renderWindow) interactor.Initialize() interactor.Start() ``` 在上面的代码中,我们首先使用vtkDICOMImageReader类加载DICOM数据,然后创建vtkImageReslice对象进行重新采样和旋转,接着创建vtkImageActor对象将vtkImageData对象渲染为图像,再创建vtkRenderer对象将vtkImageActor对象添加到渲染器中,最后创建vtkRenderWindow对象显示渲染器中的图像,并实现交互操作。运行程序后,可以看到矢状面的可视化结果。

相关推荐

c语言下,vtk包含了多种函数库,方便用户进行3D图形的绘制。其中,vtkPlaneSource就是用来绘制平面的方法之一。 vtkPlaneSource生成一个由四边形构成的平面,可通过设置相关属性对其进行调整。通过vtkRenderer类渲染图形,方便地实现将图形输出到屏幕上,或作为其他应用程序的输入,例如3D建模软件等。 使用vtk绘制平面,可以用以下步骤: 1.包含vtk头文件 #include<vtkPlaneSource.h> #include<vtkSmartPointer.h> #include<vtkPolyDataMapper.h> #include<vtkActor.h> #include<vtkRenderer.h> #include<vtkRenderWindow.h> #include<vtkRenderWindowInteractor.h> 2.新建平面对象 vtkSmartPointer<vtkPlaneSource> planeSource = vtkSmartPointer<vtkPlaneSource>::New(); 3.设置平面属性 planeSource->SetXResolution(4); //设置X方向上四边形的数目 planeSource->SetYResolution(4); //设置Y方向上四边形的数目 planeSource->SetOrigin(-1, -1, 0);//设置平面的原点 planeSource->SetPoint1(1, -1, 0);//设置平面的第一个端点 planeSource->SetPoint2(-1, 1, 0);//设置平面的第二个端点 4.创建Mapper vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputConnection(planeSource->GetOutputPort()); 5.创建Actor vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); 6.创建Renderer vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); renderer->AddActor(actor); 7.创建窗口 vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); renderWindow->SetSize(640, 480); 8.创建交互器 vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); interactor->SetRenderWindow(renderWindow); interactor->Initialize(); 9.开始绘制 renderWindow->Render(); interactor->Start(); 以上就是用vtk绘制平面的全过程,您可以根据实际需求设置平面的大小和位置等属性,使绘制的平面更加符合预期效果。
VTK(Visualization Toolkit)是一个用于可视化和图形处理的开源软件包,可用于创建各种光滑、渐变和复杂的3D图形。要使用VTK实现草图绘制,可以按照以下步骤进行: 1. 导入所需的VTK库: 通过在代码开始部分添加必要的VTK库导入语句,如“import vtk”来导入VTK相关的库函数。 2. 创建绘制窗口和渲染器: 使用vtkRenderWindow类创建一个绘制窗口,并使用vtkRenderer类创建一个渲染器对象。将渲染器与绘制窗口相关联,以便可以在窗口中显示渲染结果。 3. 创建草图绘制工具: 使用VTK的一些基本几何图元(如线段、圆等)和交互操作类来创建绘制工具。例如,可以使用vtkLineSource类创建直线,使用vtkCircleSource类创建圆等。 4. 连接绘制工具和渲染器: 将绘制工具添加到渲染器中,以便可以在渲染器中显示绘制的草图。使用vtkActor类将绘制工具与渲染器关联起来,并设置绘制工具在渲染器中显示的属性,例如颜色和线宽等。 5. 设置交互操作: 使用vtkRenderWindowInteractor类创建一个交互操作对象,以便用户可以与绘制窗口进行交互。例如,用户可以使用鼠标或触摸屏输入来绘制草图。 6. 更新渲染: 在设置好交互操作后,调用vtkRenderWindow类的Render方法,更新渲染器并在绘制窗口中显示草图。 通过上述步骤,就可以使用VTK实现草图绘制了。当用户在绘制窗口中进行绘制时,草图绘制工具会生成相应的几何图元,并在渲染器中显示出来。用户可以根据需要修改绘制结果,也可以保存草图为文件,以便后续使用或分析。绘制过程中,交互操作还可以提供一些功能,如平移、缩放和旋转等操作,以便更方便地绘制草图。总之,使用VTK实现草图绘制可以为用户提供一个简单易用、灵活多样的绘图工具。
好的,我理解了你的问题。要用 VTK 实现一个 transform filter,可以按以下步骤进行: 1. 创建一个 VTK 数据源,可以是任何类型的数据集,例如 vtkPolyData 或 vtkImageData。 2. 创建一个 vtkTransform 对象,用于定义你要进行的变换。 3. 创建一个 vtkTransformFilter 对象,并将数据源作为输入。 4. 将 vtkTransform 对象设置为 vtkTransformFilter 的变换。 5. 使用 vtkTransformFilter 的 Update() 方法更新输出数据。 下面是一个示例代码,可以将 vtkPolyData 沿 x 轴平移 5 个单位: c++ #include <vtkSmartPointer.h> #include <vtkPolyData.h> #include <vtkTransform.h> #include <vtkTransformFilter.h> int main() { // 创建一个 VTK 数据源 vtkSmartPointer<vtkPolyData> input = vtkSmartPointer<vtkPolyData>::New(); // 创建一个 vtkTransform 对象 vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTransform>::New(); transform->Translate(5.0, 0.0, 0.0); // 创建一个 vtkTransformFilter 对象,并将数据源作为输入 vtkSmartPointer<vtkTransformFilter> transformFilter = vtkSmartPointer<vtkTransformFilter>::New(); transformFilter->SetInputData(input); // 将 vtkTransform 对象设置为 vtkTransformFilter 的变换 transformFilter->SetTransform(transform); // 更新输出数据 transformFilter->Update(); // 获取输出数据 vtkSmartPointer<vtkPolyData> output = transformFilter->GetOutput(); return 0; } 希望这个示例能够帮助你实现你的 transform filter!
以下是一个简单的示例,展示如何使用ITK和VTK库读取DICOM文件并将其转换为VTK数据: c++ #include <vtkSmartPointer.h> #include <vtkDICOMImageReader.h> #include <vtkImageData.h> #include <vtkImageViewer2.h> #include <itkImage.h> #include <itkImageFileReader.h> int main(int argc, char* argv[]) { // 读取DICOM文件并将其转换为ITK图像 typedef itk::Image<short, 3> ImageType; typedef itk::ImageFileReader<ImageType> ReaderType; ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName("example.dcm"); reader->Update(); ImageType::Pointer itkImage = reader->GetOutput(); // 将ITK图像转换为VTK图像 vtkSmartPointer<vtkImageData> vtkImage = vtkSmartPointer<vtkImageData>::New(); vtkImage->SetDimensions(itkImage->GetLargestPossibleRegion().GetSize()[0], itkImage->GetLargestPossibleRegion().GetSize()[1], itkImage->GetLargestPossibleRegion().GetSize()[2]); vtkImage->SetSpacing(itkImage->GetSpacing()[0], itkImage->GetSpacing()[1], itkImage->GetSpacing()[2]); vtkImage->SetOrigin(itkImage->GetOrigin()[0], itkImage->GetOrigin()[1], itkImage->GetOrigin()[2]); vtkImage->AllocateScalars(VTK_SHORT, 1); vtkIdType count = 0; for (int z = 0; z < itkImage->GetLargestPossibleRegion().GetSize()[2]; z++) { for (int y = 0; y < itkImage->GetLargestPossibleRegion().GetSize()[1]; y++) { for (int x = 0; x < itkImage->GetLargestPossibleRegion().GetSize()[0]; x++) { vtkImage->SetScalarComponentFromDouble(x, y, z, 0, itkImage->GetPixel({ x, y, z })); count++; } } } // 显示VTK图像 vtkSmartPointer<vtkImageViewer2> viewer = vtkSmartPointer<vtkImageViewer2>::New(); viewer->SetInputData(vtkImage); viewer->Render(); viewer->GetRenderWindow()->SetWindowName("DICOM Viewer"); viewer->GetRenderWindow()->Render(); viewer->Start(); return EXIT_SUCCESS; } 需要注意的是,这只是一个简单的示例,仅适用于读取和显示单张DICOM文件。在实际应用中,可能需要处理多个DICOM文件、根据DICOM标签进行图像处理等等。
由于DICOM是医学图像的标准格式,因此许多医学图像处理软件都支持DICOM格式。在C语言中,可以使用一些开源库来读取DICOM文件,例如DCMTK(DICOM Toolkit)和GDCM(Grassroots DICOM)。使用这些库可以轻松地读取DICOM文件并将其转换为VTK数据。 以下是使用DCMTK库读取DICOM文件并将其转换为VTK数据的示例代码: c #include <dcmtk/config/osconfig.h> #include <dcmtk/dcmdata/dctk.h> #include <dcmtk/dcmimgle/dcmimage.h> #include <vtkImageData.h> #include <vtkSmartPointer.h> #include <vtkImageImport.h> vtkSmartPointer<vtkImageData> readDicomFile(const char* fileName) { // Load DICOM file DcmFileFormat fileFormat; OFCondition status = fileFormat.loadFile(fileName); if (!status.good()) { std::cerr << "Error reading DICOM file: " << status.text() << std::endl; return nullptr; } // Get DICOM image data DcmDataset* dataset = fileFormat.getDataset(); DicomImage* image = new DicomImage(dataset, EXS_Unknown); if (image == nullptr || image->getStatus() != EIS_Normal) { std::cerr << "Error getting DICOM image data" << std::endl; return nullptr; } // Convert DICOM image data to VTK data vtkSmartPointer<vtkImageImport> importer = vtkSmartPointer<vtkImageImport>::New(); importer->SetDataSpacing(image->getSpacing()); importer->SetDataOrigin(image->getOrigin()); importer->SetWholeExtent(image->getDimension()); importer->SetDataExtentToWholeExtent(); importer->SetDataScalarTypeToUnsignedShort(); importer->SetNumberOfScalarComponents(1); importer->SetImportVoidPointer(image->getOutputData(16)); importer->Update(); vtkSmartPointer<vtkImageData> imageData = vtkSmartPointer<vtkImageData>::New(); imageData->ShallowCopy(importer->GetOutput()); delete image; return imageData; } 要使用上述代码,您需要将DCMTK库和VTK库添加到项目中,并在代码中包含所需的头文件。然后,您可以使用以下代码调用上述函数: c vtkSmartPointer<vtkImageData> imageData = readDicomFile("path/to/dicom/file.dcm"); if (imageData == nullptr) { std::cerr << "Error reading DICOM file" << std::endl; return 1; } // Use VTK data as needed
要使用VTK在Python中进行三维重建面绘制,你需要完成以下步骤: 1. 安装VTK库:你需要先安装VTK库,这可以通过使用pip安装来完成。 2. 导入必要的库:在Python代码中,你需要导入VTK库和其他必要的库,例如numpy和matplotlib。 3. 创建图形窗口:使用vtkRenderWindow类创建一个图形窗口。 4. 创建渲染器:使用vtkRenderer类创建一个渲染器。 5. 创建演员:使用vtkActor类创建一个演员,并将其添加到渲染器中。 6. 创建数据源:使用vtkPolyData类创建一个数据源,并将其添加到演员中。 7. 创建映射器:使用vtkPolyDataMapper类创建一个映射器,并将其添加到演员中。 8. 设置外观:使用vtkProperty类设置演员的外观属性,例如颜色和透明度。 9. 显示图形:使用vtkRenderWindowInteractor类创建一个图形显示器,并启动它以显示三维重建面绘制。 这里是一个示例代码: python import vtk import numpy as np import matplotlib.pyplot as plt # 创建图形窗口 window = vtk.vtkRenderWindow() # 创建渲染器 renderer = vtk.vtkRenderer() window.AddRenderer(renderer) # 创建演员 actor = vtk.vtkActor() renderer.AddActor(actor) # 创建数据源 points = np.random.rand(100, 3) polyData = vtk.vtkPolyData() pointsVTK = vtk.vtkPoints() for point in points: pointsVTK.InsertNextPoint(point) polyData.SetPoints(pointsVTK) # 创建映射器 mapper = vtk.vtkPolyDataMapper() mapper.SetInputData(polyData) actor.SetMapper(mapper) # 设置外观 property = vtk.vtkProperty() property.SetColor(1, 0, 0) actor.SetProperty(property) # 显示图形 interactor = vtk.vtkRenderWindowInteractor() window.SetInteractor(interactor) window.Render() interactor.Start() 这个示例代码会在窗口中显示一个由随机生成的点构成的红色三维重建面绘制。你可以根据自己的需要修改点的数量和外观属性,以创建不同的三维重建面绘制。
好的,让我来回答你的问题。 首先,让我们来简单了解一下Marching Cubes算法是什么。Marching Cubes算法是一种体绘制技术,将三维体数据转换为表面网格,从而实现可视化的目的。这个算法可以用于任何三维数据集,包括医学图像、地质勘探数据、气象数据等等。在Marching Cubes算法中,我们需要输入一个三维的体数据集,然后根据这个数据集的数值,生成一个表面网格。 接下来,我们来谈一下使用vtk实现Marching Cubes算法绘制自由面信息的步骤: 1. 首先,我们需要读取VOF场数据集。我们可以使用vtkImageData类来读取VOF场数据集,然后使用vtkContourFilter类将数据集转化为等值面。vtkContourFilter类可以根据一组等值线来绘制出等值面。等值线是一条连接相同数值的点的线,等值面则是由多个等值线构成的面。 2. 然后,我们需要根据VOF场数据集的数值,计算出等值面的位置和法向量。这个过程可以使用Marching Cubes算法来实现。Marching Cubes算法将三维体数据集划分为一个个小的立方体,然后根据每个立方体的数值和边界情况,决定等值面的位置和法向量。 3. 最后,我们可以使用vtkActor和vtkRenderer类来将等值面添加到场景中,并使用vtkRenderWindow类将场景渲染到屏幕上。vtkActor类表示一个三维模型,可以设置其颜色、材质等属性。vtkRenderer类表示一个渲染器,可以设置其渲染的视角、光照等属性。vtkRenderWindow类表示一个窗口,可以将渲染结果显示在屏幕上。 总之,使用vtk实现Marching Cubes算法绘制自由面信息的步骤包括读取数据集、计算等值面位置和法向量、添加等值面到场景中以及渲染场景。需要注意的是,这个过程可能会比较复杂,需要一定的编程技巧和经验。
在VTK中,获取切面数据有多种方式,其中一种常用的方法是使用vtkCutter类。vtkCutter类可以根据一个平面将3D数据集切割成2D的切面数据,并且可以对切面数据进行裁剪和剖分。 以下是一个使用vtkCutter类获取切面数据的示例代码: cpp #include <vtkSmartPointer.h> #include <vtkCutter.h> #include <vtkPlane.h> #include <vtkXMLPolyDataReader.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderWindow.h> #include <vtkRenderer.h> #include <vtkRenderWindowInteractor.h> int main(int argc, char* argv[]) { // 读取一个3D数据集 vtkSmartPointer<vtkXMLPolyDataReader> reader = vtkSmartPointer<vtkXMLPolyDataReader>::New(); reader->SetFileName("input.vtp"); reader->Update(); // 创建一个平面 vtkSmartPointer<vtkPlane> plane = vtkSmartPointer<vtkPlane>::New(); plane->SetOrigin(0, 0, 0); plane->SetNormal(0, 0, 1); // 使用vtkCutter类获取切面数据 vtkSmartPointer<vtkCutter> cutter = vtkSmartPointer<vtkCutter>::New(); cutter->SetInputData(reader->GetOutput()); cutter->SetCutFunction(plane); cutter->Update(); // 显示切面数据 vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputConnection(cutter->GetOutputPort()); vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); renderer->AddActor(actor); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); interactor->SetRenderWindow(renderWindow); renderWindow->Render(); interactor->Start(); return 0; } 在上述示例代码中,我们首先读取了一个3D数据集,然后创建了一个平面,并使用vtkCutter类获取切面数据。最后,将切面数据显示出来。 需要注意的是,上述示例代码中的数据类型是vtkPolyData,如果你使用的是vtkImageData或vtkStructuredGrid等数据类型,需要相应地修改代码。

最新推荐

2011 VTK医学图像三维重建应用及实现.pdf

使用面绘制的移动立方体法和体绘制的光线投影法,在Microsoft Visual Studio 2005下使用C++语言分别实现了 医学图像三维重建,并给出了系统实例。实践证明,使用VTK开发医学图像三维重建系统,重建效果好,开发 时间...

VTK开发精要:数据结构与管线机制

讲述VTK开发两大核心知识点:数据存储于管线机制。着重对vtkExecutive、vtkDemandDrivenPipeline的实现做了分析。

VTK+VS2017 安装配置.docx

VTK+VS2017+ CMAKE 安装配置本资料为VTK用Cmake进行编译,并生成工程的Demo文档,新手入门可参考

javascript $.each用法例子

$Each 是一个常见的 JavaScript 库或框架中的方法,用于迭代数组或对象的元素,并生成相应的 HTML 或其他内容。

厦门大数据比赛.zip

比赛项目源码

代码随想录最新第三版-最强八股文

这份PDF就是最强⼋股⽂! 1. C++ C++基础、C++ STL、C++泛型编程、C++11新特性、《Effective STL》 2. Java Java基础、Java内存模型、Java面向对象、Java集合体系、接口、Lambda表达式、类加载机制、内部类、代理类、Java并发、JVM、Java后端编译、Spring 3. Go defer底层原理、goroutine、select实现机制 4. 算法学习 数组、链表、回溯算法、贪心算法、动态规划、二叉树、排序算法、数据结构 5. 计算机基础 操作系统、数据库、计算机网络、设计模式、Linux、计算机系统 6. 前端学习 浏览器、JavaScript、CSS、HTML、React、VUE 7. 面经分享 字节、美团Java面、百度、京东、暑期实习...... 8. 编程常识 9. 问答精华 10.总结与经验分享 ......

基于交叉模态对应的可见-红外人脸识别及其表现评估

12046通过调整学习:基于交叉模态对应的可见-红外人脸识别Hyunjong Park*Sanghoon Lee*Junghyup Lee Bumsub Ham†延世大学电气与电子工程学院https://cvlab.yonsei.ac.kr/projects/LbA摘要我们解决的问题,可见光红外人重新识别(VI-reID),即,检索一组人的图像,由可见光或红外摄像机,在交叉模态设置。VI-reID中的两个主要挑战是跨人图像的类内变化,以及可见光和红外图像之间的跨模态假设人图像被粗略地对准,先前的方法尝试学习在不同模态上是有区别的和可概括的粗略的图像或刚性的部分级人表示然而,通常由现成的对象检测器裁剪的人物图像不一定是良好对准的,这分散了辨别性人物表示学习。在本文中,我们介绍了一种新的特征学习框架,以统一的方式解决这些问题。为此,我们建议利用密集的对应关系之间的跨模态的人的形象,年龄。这允许解决像素级中�

javascript 中字符串 变量

在 JavaScript 中,字符串变量可以通过以下方式进行定义和赋值: ```javascript // 使用单引号定义字符串变量 var str1 = 'Hello, world!'; // 使用双引号定义字符串变量 var str2 = "Hello, world!"; // 可以使用反斜杠转义特殊字符 var str3 = "It's a \"nice\" day."; // 可以使用模板字符串,使用反引号定义 var str4 = `Hello, ${name}!`; // 可以使用 String() 函数进行类型转换 var str5 = String(123); //

数据结构1800试题.pdf

你还在苦苦寻找数据结构的题目吗?这里刚刚上传了一份数据结构共1800道试题,轻松解决期末挂科的难题。不信?你下载看看,这里是纯题目,你下载了再来私信我答案。按数据结构教材分章节,每一章节都有选择题、或有判断题、填空题、算法设计题及应用题,题型丰富多样,共五种类型题目。本学期已过去一半,相信你数据结构叶已经学得差不多了,是时候拿题来练练手了,如果你考研,更需要这份1800道题来巩固自己的基础及攻克重点难点。现在下载,不早不晚,越往后拖,越到后面,你身边的人就越卷,甚至卷得达到你无法想象的程度。我也是曾经遇到过这样的人,学习,练题,就要趁现在,不然到时你都不知道要刷数据结构题好还是高数、工数、大英,或是算法题?学完理论要及时巩固知识内容才是王道!记住!!!下载了来要答案(v:zywcv1220)。

通用跨域检索的泛化能力

12056通用跨域检索:跨类和跨域的泛化2* Soka Soka酒店,Soka-马上预订;1印度理工学院,Kharagpur,2印度科学学院,班加罗尔soumava2016@gmail.com,{titird,somabiswas} @ iisc.ac.in摘要在这项工作中,我们第一次解决了通用跨域检索的问题,其中测试数据可以属于在训练过程中看不到的类或域。由于动态增加的类别数量和对每个可能的域的训练的实际约束,这需要大量的数据,所以对看不见的类别和域的泛化是重要的。为了实现这一目标,我们提出了SnMpNet(语义Neighbourhood和混合预测网络),它包括两个新的损失,以占在测试过程中遇到的看不见的类和域。具体来说,我们引入了一种新的语义邻域损失,以弥合可见和不可见类之间的知识差距,并确保潜在的空间嵌入的不可见类是语义上有意义的,相对于其相邻的类。我们还在图像级以及数据的语义级引入了基于混�