VTK学习笔记(十)基于VTK和ITK程序

2023-05-16

VTK学习笔记(十)基于VTK和itk程序

  • 1、程序
  • 2、CMakeLists.txt
  • 3、哪里使用了VTK
  • 4、程序的执行
  • 5、数据存储与显示
  • 6、数据变化流程

1、程序

下面程序是一个基于ITK的连通域分析程序

#include "itkImage.h"
#include <vtkSmartPointer.h>
#include <vtkPNGWriter.h>
#include "itkScalarConnectedComponentImageFilter.h"
#include <itkImageToVTKImageFilter.h> 
#include <itkVTKImageToImageFilter.h>
#include <string>
#include <iostream>
#include<vtkImageShiftScale.h>
using namespace std;
void CreateImage(itk::Image<unsigned char, 2>* const image)
{
	// Create an image with 2 connected components
	itk::Image<unsigned char, 2>::IndexType start = { {0,0} };
	start[0] = 0;
	start[1] = 0;
 
	itk::Image<unsigned char, 2>::SizeType size;
	unsigned int NumRows = 100;
	unsigned int NumCols = 200;
	size[0] = NumRows;
	size[1] = NumCols;
 
	typename itk::Image<unsigned char, 2>::RegionType region(start, size);
 
	image->SetRegions(region);
	
	image->Allocate(true);// 全0的像素(黑色)
 
	// Make a square
	for (itk::Image<unsigned char, 2>::IndexValueType r = 5; r < 40; r++)
	{
		for (itk::Image<unsigned char, 2>::IndexValueType c = 10; c < 50; c++)
		{
			itk::Image<unsigned char, 2>::IndexType pixelIndex = { {r,c} };
 
			image->SetPixel(pixelIndex, 100);//灰色
		}
	}
 
	// Make another square
	for (typename itk::Image<unsigned char, 2>::IndexValueType r = 50; r < 70; r++)
	{
		for (typename itk::Image<unsigned char, 2>::IndexValueType c = 50; c < 80; c++)
		{
			typename itk::Image<unsigned char, 2>::IndexType pixelIndex = { {r,c} };
 
			image->SetPixel(pixelIndex, 255);//白色
		}
	}
 
}
void print(const std::string& file, itk::Image<unsigned char, 2>* image)
{
	ofstream fout(file);
	auto size = image->GetBufferedRegion().GetSize();
	for (auto i = 0; i < size[0]; i++)
	{
		for (auto j = 0; j < size[1]; j++)
		{
			itk::Image<unsigned char, 2>::IndexType index{ {i,j} };
			auto c = image->GetPixel(index);
			fout << (int)c;
		}
		fout << std::endl;
	}
}
int main(int argc, char *argv[])
{
	short distanceThreshold = 4;
 
	auto image = itk::Image<unsigned char, 2>::New();
	CreateImage(image.GetPointer());// 创建一个背景为黑色的,包含两个长方形区域(一个为灰色100,一个为白色255)的图片
	image->Update();
 
	//将itk图片转换成vtk图片
	auto imageToVtkImage = itk::ImageToVTKImageFilter<itk::Image<unsigned char, 2>>::New();
	imageToVtkImage->SetInput(image.GetPointer());
	imageToVtkImage->Update();// 只有更新之后,后续使用者才可以拿到真正的数据
 
	//保存vtk图片为png文件
	vtkSmartPointer<vtkPNGWriter> writer = vtkSmartPointer<vtkPNGWriter>::New();
	writer->SetFileName("E:/1/1CreateImage.png");
	writer->SetInputData(imageToVtkImage->GetOutput());
	writer->Write();
	//保存vtk图片像素值到文本文件
	print("E:/1/1CreateImage.txt", image.GetPointer());
 
	//从vtk图片得到连通区域:1,2,3(每个连通区域中的像素点的值)
	auto connected = itk::ScalarConnectedComponentImageFilter<itk::Image<unsigned char, 2>, itk::Image<unsigned char, 2>>::New();
	connected->SetInput(image);
	connected->SetDistanceThreshold(distanceThreshold);
	connected->Update();
	//输出vtk图片连通区域:1,2,3
	print("E:/1/2ScalarConnectedComponentImage.txt", connected->GetOutput());
 
	//连通区域图片的像素值为label值,只有1,2,3。
	//每个连通区域的像素都用一个Id值存储,由于1,2,3这种值作为像素值的话都是接近黑色,
	//所以要想打印出区分明显的图片需要vtkImageShiftScale变换
	imageToVtkImage->SetInput(connected->GetOutput());
	imageToVtkImage->Update();
 
	double range[2];
	imageToVtkImage->GetOutput()->GetScalarRange(range);
 
	vtkSmartPointer<vtkImageShiftScale>scale = vtkSmartPointer<vtkImageShiftScale>::New();
	scale->SetInputData(imageToVtkImage->GetOutput());
	scale->SetScale(255 / range[1]);//大范围的最大值除以小范围的最大值得到变换的放大倍数:(1,2, 3)->(85, 170, 255)
	scale->Update();
 
	//将变换后的图片保存到png
	writer->SetFileName("E:/1/3ConnectedComponentImage.png");
	writer->SetInputData(scale->GetOutput());
	writer->Write();
 
	auto vtkImageToImage = itk::VTKImageToImageFilter<itk::Image<unsigned char, 2>>::New();
	vtkImageToImage->SetInput(scale->GetOutput());
	vtkImageToImage->Update();
	//输出连通区域:(85, 170, 255)
	print("E:/1/3ConnectedComponentImage.txt", vtkImageToImage->GetOutput());
 
	std::cout << "return ok" << std::endl;
 
	return EXIT_SUCCESS;
}

2、CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(test)
set(ITK_DIR D:/ProgramFiles/ITK-5.2/lib/cmake/ITK-5.2)

FIND_PACKAGE(ITK REQUIRED)
INCLUDE(${ITK_USE_FILE})
ADD_EXECUTABLE(test test.cpp)
TARGET_LINK_LIBRARIES(test ${ITK_LIBRARIES})

3、哪里使用了VTK

从源文件可以看到,引用了VTK头文件

#include <vtkSmartPointer.h>
#include <vtkPNGWriter.h>
#include<vtkImageShiftScale.h>

但是在CMakeLists.txt中并没有引用vtk的库,原因是在编译ITK时做了链接。
在编译ITK时选择了VTKGlue,并指定了路径。

在这里插入图片描述

4、程序的执行

因为itk使用的是静态库,因此关联的itk静态库都被编译进exe可执行程序中了。
关联的vtk库是动态库,因此需要将vtk动态库拷贝到可执行程序的同级目录下。
这样才可以执行可执行程序。

5、数据存储与显示

程序作用
手动创建一个黑色0的图片,其中加入两个矩形,一个为像素值为100的灰色;另一个是像素值为255的白色
将图片输出为png和TXT
用连通区域算子计算出连通区域1,2,3
将连通区域输出到TXT
为了能够显示像素为1,2,3的图片,放大这些像素
输出放大后的像素图片到png
输出放大后的像素图片到TXT
背景图片 100*200,宽100高200,col=100, row = 200
在这里插入图片描述
程序中设置灰色和白色范围跟图片显示的区别可以看出,数据是以左下为原点的。
这一点跟opencv或其他图像库以左上角为原点不一样。
在这里插入图片描述

6、数据变化流程

1、一张黑色背景图片100*200,上有两个矩形区域 亮度分别为 10, 255.
2、使用连通域分析,得到标签图像,像素值对应类别,背景为1,区域1为2.区域2为3.
3、为了显示标签结果,因为1,2,3都是黑色,因此需要通过缩放提高亮度,采用缩放比 255/3=85倍缩放比,亮度值变为 85,170,255.
原图:
在这里插入图片描述
缩放亮度后标签:
在这里插入图片描述
数值显示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

参考:ScalarConnectedComponentImageFilter 连通区域

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VTK学习笔记(十)基于VTK和ITK程序 的相关文章

随机推荐

  • Mvc Web工程中加入Web Api后,Web Api接口无法访问

    用vs2015 C 建立了一个web mvc工程 xff0c 实现了一些简单的功能 xff0c 包括对后台数据库的访问 xff0c 添加 修改数据等普通功能 xff0c 其中有好几个controller xff0c 比如用户管理 任务添加修
  • OpenMP与OpenMPI介绍与简单程序编写

    首先说一下OpenMP与OpenMPI的区别 OpenMP主要是在单机上进行并行 xff0c 是基于共享内存的 xff0c 共享内存就是多个核 xff08 包括单CPU多核和多CPU多核 xff08 都是单机 xff09 xff09 共享一
  • Web Api获取POST中的body数据

    一个普通的web api xff0c 大佬说为了安全 xff0c 上传的参数数据一般是放在Body中的 xff0c 所以后台也要从body中来拿参数 xff0c 这个确实好一些 xff0c 在地址栏中看不到参数 xff0c 相对来说 xff
  • MFC视图中的OnPaint()更新

    今天弄了个工具 xff0c vs2015 mfc 单文档结构的工程 xff0c 没有选择 34 文档 视图体系结构支持 34 xff0c 因为我不需要文档 xff0c 只需要有个视图就行了 后台有个从网络接收数据的服务 xff0c 当收到数
  • vs中加入.h文件后改名为.cpp后,其中的函数无法被链接

    这个问题一般碰不到 一个项目 xff0c 是vs2015 c 43 43 win32类型的 xff0c 项目不大 xff0c 大约有10来个源文件 xff0c 一切都是正常的 后来由于需要添加md5加密 xff0c 所以就从别的项目中拿了一
  • windows下编译opencv 3.4.0

    为了方便后期的调试 xff0c 自己动手编译opencv3 4 0 xff0c 这样有需要的时候还可以自己修改修改源代码 通常来说 xff0c 编译32位比较简单 xff0c 直接用cmake生成编译的工程就行了 xff0c 但64位就比较
  • opencv添加的新接口clearVec()的实现

    自己编译的opencv xff0c 之前文章有说添加了这个接口 xff0c 也有上传3 3 0版本添加这个接口之后编译好的库 xff0c 但是没有把实现过程展现出来 xff0c 导致有些朋友问我如何实现的 xff0c 今天把这个实现放出来
  • Unity 3D代码在vs中无法自动提示的解决办法

    我安装Unity 3D后 xff0c 建立一个工程 xff0c 采用vs2019来编写代码 xff0c 发现没有自动提示功能 xff0c 根据网上说的 xff0c 要在unity中选择vs2019做为编辑器 xff0c 我也选择了 xff0
  • Arduino的全局变量的单独定义

    Arduino语言和C语言很像 xff0c 比如先定义变量再使用 xff0c 也可以采用 define 进行一些预定义等等 xff0c 但又有一些不同 当一个文件中的代码理过多时 xff0c 如果想把它们分开成多个文件 xff0c 则涉及到
  • 苏泊尔电饭煲不工作的维修

    本篇文章与其说是维修 xff0c 倒不如说成是 拆 xff0c 因为维修相对容易 xff0c 但想拆开却很艰难 xff0c 大部分的时间都花在了拆的工作上面 老家伙的样子如下 型号为 xff1a CYSB50FC99 100 xff0c 铭
  • 萨克斯吹不响的解决办法

    刚开始吹萨克斯 xff0c 发现总是吹不响 看各种入门的文章 xff0c 很多都强调口型的重要性 xff0c 各文章说得也都差不多 xff0c 我仔细捉摸 xff0c 不断尝试 xff0c 似乎还是不得要领 特别是安装好之后 xff0c 很
  • webpack是什么

    一 webpack是什么 webpack 是一个用于现代 JavaScript 应用程序的静态模块化打包构建工具 模块化 xff1a 服务端Common js xff08 module exports require xff09 浏览器端E
  • OLED显示秒表

    OLED显示秒表 include stm32f10x h include sys h include delay h include relay h include oled0561 h include led h include key
  • IP和MAC的通俗理解

    首先看下为什么有IP地址 xff0c 借鉴大佬的帖子 https showme codes 2018 05 17 understand mac ip 若有侵权 xff0c 即刻删除 IP和MAC都是为了确定一个地址 xff0c 区别在于 I
  • 图像特征提取三大法宝:HOG特征、LBP特征、Haar-like特征

    转自http dataunion org 20584 html xff08 一 xff09 HOG特征 1 HOG特征 xff1a 方向梯度直方图 xff08 Histogram of Oriented Gradient HOG xff09
  • 中英文环境配置 /etc/environment

    lwg 64 anima cat etc environment 中文界面配置 LANGUAGE 61 34 zh CN zh en US en 34 LC ALL 61 zh CN UTF 8 LANG 61 zh CN UTF 8 GS
  • SDN你必须知道的十大问题——SDN有哪些开源项目

    SDN之所以能够发展的如此之快 xff0c 其中开源社区的贡献不容忽视 随着SDN 各类社区的不断发展状大 xff0c 开源项目也在不断增多 xff0c 从控制器到交换机再到网络虚拟化 xff0c 开源项目一度让小编眼花缭乱 可能你熟悉Op
  • 使用Eclipse编译运行MapReduce程序 Hadoop2.6.0/Ubuntu

    上篇介绍了使用命令行编译打包运行自己的MapReduce程序 xff0c 使用 Eclipse 更加方便 要在 Eclipse 上编译和运行 MapReduce 程序 xff0c 需要安装 hadoop eclipse plugin xff
  • windows远程连接阿里云ubuntu(问题集合)

    w 阿里云轻量应用服务器简单图形化界面以及VNC安装使用 橘游静的博客 CSDN博客 成功部署如上 xff1a 灰屏问题解决方法如下 xff1a vncviewe连接ubuntu系统显示灰屏解决方案 jx18080136806的专栏 CSD
  • VTK学习笔记(十)基于VTK和ITK程序

    VTK学习笔记 xff08 十 xff09 基于VTK和itk程序 1 程序2 CMakeLists txt3 哪里使用了VTK4 程序的执行5 数据存储与显示6 数据变化流程 1 程序 下面程序是一个基于ITK的连通域分析程序 span