VTK感兴趣勾画 方式一: vtkImageMask实现-程序员宅基地

技术标签: 算法  c++  VTK  vtk  

1、使用 vtkImageMask  实现。

优点:简单方便,mask与原始图像大小一致;

缺点:只支持单一掩码图像,无法实现多个掩码的编辑;

2、演示源码

void ImageMask2()
{
   // 读取数据
	int m_Dim[3] = { 512,512,333 };
	double m_Spacing[3] = { 0.32,0.32,0.8 };

	double m_Origin[3];

	m_Origin[0] = -m_Dim[0] * m_Spacing[0] * 0.5;
	m_Origin[1] = -m_Dim[1] * m_Spacing[1] * 0.5;
	m_Origin[2] = -m_Dim[2] * m_Spacing[2] * 0.5;

	size_t fSize = m_Dim[0] * m_Dim[1] * m_Dim[2] * sizeof(short);

	vtkImageData* input = vtkImageData::New();
	input->SetDimensions(m_Dim[0], m_Dim[1], m_Dim[2]);
	input->SetSpacing(m_Spacing[0], m_Spacing[1], m_Spacing[2]);
	input->SetOrigin(m_Origin);
	input->AllocateScalars(VTK_SHORT, 1);
	void *ptr = input->GetScalarPointer();
	//memcpy(ptr, m_pSrcData->m_pSrc, fSize);

	std::string m_ImgFile = "D:\\spineCT\\IMG-0001-00001.img";
	FILE *pFile = fopen(m_ImgFile.c_str(), "rb");
	if (pFile == NULL)
		return;

	fread(ptr, 1, fSize, pFile);
	fclose(pFile);


	//====================================================
    // 创建测试掩码图像
	vtkImageData* mask = vtkImageData::New();
	mask->SetDimensions(m_Dim[0], m_Dim[1], m_Dim[2]);
	mask->SetSpacing(m_Spacing[0], m_Spacing[1], m_Spacing[2]);
	mask->SetOrigin(m_Origin);
	mask->AllocateScalars(VTK_UNSIGNED_CHAR, 1);
	void *ptrMak = mask->GetScalarPointer();
	memset(ptrMak, 0, 512 * 512 * 333);

	unsigned char* pMask = (unsigned char*)ptrMak;
	for (int i = 0; i < 333; i++)
	{
		for (int j = 200; j < 400; j++)
		{
			for (int k = 200; k < 400; k++)
			{
				pMask[i * 512 * 512 + j * 512 + k] = 255;
			}

		}
	}
	//====================================================

	vtkSmartPointer<vtkImageMapToWindowLevelColors> windowLevel = vtkSmartPointer<vtkImageMapToWindowLevelColors>::New();
	
	windowLevel->SetWindow(800);
	windowLevel->SetLevel(800);
	windowLevel->SetInputData(input);
	windowLevel->Update();


	vtkNew<vtkImageMask> maskFilter;
	maskFilter->SetImageInputData(windowLevel->GetOutput());
	maskFilter->SetMaskInputData(mask);

	maskFilter->SetMaskedOutputValue(255, 0, 0);
	maskFilter->SetMaskAlpha(0.4);
	maskFilter->NotMaskOn();  // 255 不可见
	maskFilter->Update();


	int imeExtent[6];
	input->GetExtent(imeExtent);
	input->GetExtent(ImageExtent);

	imeExtent[4] = 0;
	imeExtent[5] = 0;
	// Display the image
	vtkSmartPointer<vtkImageActor> actor = vtkSmartPointer<vtkImageActor>::New();
	actor->GetMapper()->SetInputConnection(maskFilter->GetOutputPort());
	actor->SetDisplayExtent(imeExtent);


	//itemActor->SetOrigin();
	vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
	renderer->AddActor(actor);

	vtkCamera* camera  = renderer->GetActiveCamera();
	camera->ParallelProjectionOn();
	camera->SetParallelScale(100);
	camera->SetFocalPoint(0,0,0);
	camera->SetPosition(0,0,400);
	camera->SetViewUp(0,1,0);

	vtkSmartPointer<vtkRenderWindow> window = vtkSmartPointer<vtkRenderWindow>::New();
	window->AddRenderer(renderer);

	// Set up the interaction
	vtkSmartPointer<vtkInteractorStyleImage> imageStyle = vtkSmartPointer<vtkInteractorStyleImage>::New();
	vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
	interactor->SetInteractorStyle(imageStyle);
	window->SetInteractor(interactor);
	window->Render();

	vtkSmartPointer<vtkImageInteractionCallback> callback = vtkSmartPointer<vtkImageInteractionCallback>::New();
	callback->SetImageReslice(actor, itemActor, renderer);
	callback->SetInteractor(interactor);

	imageStyle->AddObserver(vtkCommand::MouseMoveEvent, callback);
	imageStyle->AddObserver(vtkCommand::LeftButtonPressEvent, callback);
	imageStyle->AddObserver(vtkCommand::LeftButtonReleaseEvent, callback);

	imageStyle->AddObserver(vtkCommand::KeyPressEvent, callback);


	// Start interaction
	// The Start() method doesn't return until the window is closed by the user
	interactor->Start();
}

3、勾画交互-矩形工具

4、勾画交互-圆形工具 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yunzhaoqiang/article/details/121426289

智能推荐

【ArcGIS Pro微课1000例】0005:ArcGIS Pro 2.5基于矢量数据制作拉伸三维地图案例_如何在arcgis中对矢量地图进行拉伸三维显示-程序员宅基地

文章浏览阅读2.3k次,点赞6次,收藏8次。ArcGIS Pro 2.5中,可以基于某个字段,对矢量数据进行拉伸,制作精美的三维地图。本文以中国省级行政区划数据为例,基于面积字段制作3d地图。文章目录1. 新建局部场景2. 地图符号化3. 三维矢量地图制作1. 新建局部场景打开ArcGIS Pro 2.5,新建局部场景项目,并保存。2. 地图符号化在省级行政区图层上右键→符号化。选择唯一值,并选择喜欢的色带。3. 三维矢量地图制作切换到【外观】选项卡。类型:基本高度字段:Area单位:米最终结果:..._如何在arcgis中对矢量地图进行拉伸三维显示

2023最新大数据毕设选题_2023大数据毕业生毕业设计-程序员宅基地

文章浏览阅读732次。Hi,大家好,大四的同学马上要开始毕业设计啦,大家做好准备了没!学长给大家详细整理了最新的 大数据专业 相关选题,对选题有任何疑问,都可以问学长哦~学长限时开放开题指导,对开题有任何不明白的,对某项技术或算法不理解的,不知道怎么下手毕设的,都可以问学长,学长会根据你的情况提供帮助,希望能帮助到你。_2023大数据毕业生毕业设计

塞尔达传说雷电大剑位置_《塞尔达:旷野之息》其实是款烹饪游戏?游戏超多菜谱攻略奉上...-程序员宅基地

文章浏览阅读706次。《塞尔达传说:旷野之息》自发行起,就因为其超高的自由游戏度深受玩家喜爱,你可以按照主线任务,征服四大神兽,挑战人马,打败加农,拯救公主;也可以当一个自由自在的休闲玩家,游遍海拉鲁大陆,欣赏每一处风景;还可以选择做一个解密大师,探索每一处神庙,顺便寻找呀哈哈的踪迹(400座神庙900只呀哈哈,够刺激吗?)。还有些玩家,选择做一位烹饪大师,用海拉鲁大陆搜集来的各种食材,做出各种不同效果的食物。今天我们..._速速莲蓬加龙角

【BP分类】基于BP神经网络柴油机故障诊断系统附matlab代码-程序员宅基地

文章浏览阅读886次,点赞15次,收藏23次。柴油机是广泛应用于工业、农业、交通等领域的动力设备。柴油机故障会造成设备停机、经济损失,甚至安全隐患。因此,及时准确地诊断柴油机故障具有重要意义。BP神经网络BP神经网络是一种前馈型神经网络,具有强大的非线性映射能力。它由输入层、隐含层和输出层组成。输入层接收输入数据,隐含层处理数据,输出层输出结果。基于BP神经网络的柴油机故障诊断系统基于BP神经网络的柴油机故障诊断系统主要包括以下步骤:**数据采集:**采集柴油机在不同工况下的振动、温度、压力等传感器数据。

Android自定义View中的onMeasure、onLayout和onDraw方法解析_自定义view的onmeasure是如何确定它的size-程序员宅基地

文章浏览阅读687次,点赞24次,收藏19次。本文深入解析了在Android自定义View中,onMeasure、onLayout和onDraw三个核心方法的作用和使用方法。onMeasure负责测量View的大小,onLayout则确定View的位置,onDraw负责绘制View的内容。通过一个实例,我们展示了如何在自定义View中利用这三个方法来创建一个带有边框的圆形View。理解和掌握这三个方法,对于实现自定义View和自定义ViewGroup具有重要的指导意义。_自定义view的onmeasure是如何确定它的size

远程桌面时,如何登录没有设置密码的系统_远程桌面连接没有密码的电脑-程序员宅基地

文章浏览阅读1.2k次。远程桌面时,如何登录没有设置密码的系统_远程桌面连接没有密码的电脑

随便推点

网络通信技术-程序员宅基地

文章浏览阅读3.8k次,点赞2次,收藏12次。网络通信技术1. 基本概念1.1 接口1.2 表项查询方法1.2.1 内容寻址存储器2. 二层技术3. 三层技术1. 基本概念1.1 接口1.2 表项查询方法1.2.1 内容寻址存储器内容寻址存储器(Content Addressable Memory)CAM,是在传统的存储技术的基础上实现的联想记忆存储器,主要有读、写、查询操作。读操作:输入地址,返回该地址上的数据,读取速度与RAM相同;写操作:2. 二层技术3. 三层技术..._网络通信技术

简单的学生成绩管理系统(数组实现)_为什么用数组做成绩管理系统他的成绩只显示3和个数组-程序员宅基地

文章浏览阅读3.4k次,点赞6次,收藏18次。简单的学生成绩管理系统(数组实现)用java 数组写了一个简单的学生管理系统,没有连数据库,数据存放在内存,实现简单的增、删、改、查功能。一、运行图片二、部分代码package com.sky.demo;import javax.swing.text.Style;import java.util.Scanner;public class Service { Scanner scanner = new Scanner(System.in); //数组,静态初始化,分配大小 _为什么用数组做成绩管理系统他的成绩只显示3和个数组

基于Python的信用评分卡模型-give me some credit数据集,AUC 0.93 KS 0.71-程序员宅基地

文章浏览阅读4.2k次,点赞5次,收藏53次。在公众号「python风控模型」里回复关键字:学习资料,就可免费领取。 python风控模型 持牌照金融公司模型专家,教学主页 https://ke.qq.com/teacher/231469242?tuin=dcbf0_give me some credit

基于servlet+jsp 的 java 简单版商城项目_jsp servlet maven商城-程序员宅基地

文章浏览阅读1.4w次,点赞38次,收藏153次。一、 开发背景软件名称:买买买商城(servlet+jsp)使用对象:学习或了解过 java 基础课程,开始接触 javaWeb 的学生和软件爱好者二、 需求分析该买买买商城的用户包含普通用户和商城管理员。商城设置了权限验证,所有用户除了访问首页浏览商品外,均需输入账号、密码登录进入系统;商城管理员进入系统后可对用户信息、商品类别、商品信息、留言信息、新闻信息进行管理;普通用户注册成功并登..._jsp servlet maven商城

安装php_soap.dll,php如何安装soap扩展-程序员宅基地

文章浏览阅读529次。php安装soap扩展的方法:首先打开“php.ini”文件;然后添加代码为“extension = php_soap.dll”;最后修改soap配置项并保存即可。安装 SOAP 扩展对于 Windows 平台,需要在 php.ini 中加入如下代码:extension = php_soap.dll上面的工作完成之后,还需要注意的是 SOAP 扩展在配置文件中有独立的代码片段:[soap]; En..._php_soap.dll

【MybatisPlus 学习】配置多数据源_mybatisplus同一个方法里操作两个数据源-程序员宅基地

文章浏览阅读746次。适用于多种场景:纯粹多库、 读写分离、 一主多从、 混合模式等目前我们就来模拟一个纯粹多库的一个场景,其他场景类似场景说明:我们创建两个库,分别为:mybatis_plus(以前的库不动)与mybatis_plus_1(新建),将mybatis_plus库的product表移动到mybatis_plus_1库,这样每个库一张表,通过一个测试用例分别获取用户数据与商品数据,如果获取到说明多库模拟成功文章目录一、创建数据库及表二、引入依赖三、配置多数据源四、创建用户service五、创建商品serv_mybatisplus同一个方法里操作两个数据源

推荐文章

热门文章

相关标签