分别用 VTK 体绘制和面绘制来实现医学图像三维重建

2023-10-29

关注公众号:【小张Python】,为你准备了 50+ 本Python 精品电子书籍 与 50G + 优质视频学习资料,后台回复关键字:1024 即可获取;如果对博文内容有什么疑问,后台添加作者【个人微信】,可与作者直接进行交流

序言,VTK介绍:

VTK 全称为 The Visualization Toolkit (可视化工具),是一个开源、跨平台、自由获取、支持并行计算的图形应用函数;拥有3D 渲染的最新工具、提供3D交互模式以及2D绘图等。

VTK 包含一个C++类库,目前提供了众多语言接口,例如 Java、Python、TCL;在三维函数库OpenGL 的基础上采用面向对象设计方法发展起来

图形学基本概念和数据结构,是VTK的核心,VTK是通过 Pipline的形式来输送数据,实现预览效果。

三维重建

在 VTK 中,提供了两种重建方式:体绘制和面绘制 (一般来说用VTK做重建,医学图像领域较多,如 Dicom、mha、mhd;当然 VTK 也实现点云重建)

面绘制

利用面绘值用到VTK封装到的 Marching Cube 算法,简称 MC算法,MC 算法的实现主要分为三部分:

1,确定包含等值面的体元

首先介绍一下 体元的概念,体元是三维图像中由相邻的八个体素点组成的正方体方格,英语也叫 Cube,体元中角点函数值分为两种情况,一种是大于等于给定等值面的值 C0 ,则将角点设为 1 称该角点在等值面内部,否则设为0,在等值面之外,

一般来说,会出现一个角点在内,一个角点在外,则角点之间的连线(也就是体元的边)必然与等值面相交,根据这个原理就能判断等值面与哪些体元相交。

Snipaste_2020-04-05_20-28-26.jpg

Snipaste_2020-04-05_20-28-54.jpg

体元内每个角点(顶点)有两种情况:0和1,一共8个角点即分为256种( 2 8 = 256 2^8 = 256 28=256 ),根据平面对称性、中心对称性,256种最终降到15种

2,确定等值面与体元边界的交点

找到含有等值面的体元之后,接下来就是确定等值面与体元边界的交点,体元间的数值都是呈线性变化,求交点时一般采用的是线性插值,如 Case0 中等值面的两个端点 一个在外为( 标记0) ,一个在内 ( 标记为1 ) 则交点为0.5;

3,求等值面的法向量

以上步骤 1,2,3 为实现 MC 算法步骤流程,但利用 VTK ,不需要这么繁琐,主要算法步骤都已经封装到 vtkMarchingCube 类中,使用 vtkMarchingCube 时,需要设置三个参数:

  • SetValue(int i,double value) 设置第i 个等值面的值b,(提醒一下,医学图像中的灰度值范围不是 0-256 而是0-65326,但大部分取值范围都在0-1000)。
  • SetNumberofContours(int number),设置等值面的个数
  • ComputerNormalsOn() 设置计算等值面的法向量,提高渲染质量;

未命名文件 (2).png

上面这张图显示的就是 vtk 呈像的基本流程,下面是仿照官网写的用面绘制来对图像重建的代码部分:

#include<vtkRenderWindow.h>
#include<vtkRenderWindowInteractor.h>
#include<vtkDICOMImageReader.h>
#include<vtkMarchingCubes.h>
#include<vtkPolyDataMapper.h>
#include<vtkStripper.h>
#include<vtkActor.h>
#include<vtkProperty.h>
#include<vtkCamera.h>
#include<vtkOutlineFilter.h>
#include<vtkOBJExporter.h>
#include<vtkRenderer.h>
#include<vtkMetaImageReader.h>
#include<vtkInteractorStyleTrackballCamera.h>


#include<iostream>
#include<string.h>
//需要进行初始化,否则会报错
#include <vtkAutoInit.h> 
#include<vtkRenderingVolumeOpenGL2ObjectFactory.h>
#include<vtkRenderingOpenGL2ObjectFactory.h>

using namespace std;
int main()
{
	///Marching Cube; 

	vtkObjectFactory::RegisterFactory(vtkRenderingOpenGL2ObjectFactory::New());
	vtkObjectFactory::RegisterFactory(vtkRenderingVolumeOpenGL2ObjectFactory::New());

	vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New();
	vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();//WINDOW;

	renWin->AddRenderer(ren);

	vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();//wininteratcor;
	iren->SetRenderWindow(renWin);

	vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New();
	reader->SetDirectoryName("E:/DIcom_Data/DICOM");
	reader->SetDataByteOrderToLittleEndian();
	reader->Update();


	/*vtkDICOMImageReader *reader = vtkDICOMImageReader::New();
	reader->SetDirectoryName("E:/Coding Pra/VTK/VTK_Examples_StandardFormats_Input_DicomTestImages/DICOM");
	reader->SetDataByteOrderToLittleEndian();
	reader->Update();*/

	cout << "读取数据完毕" << endl;
	cout << "The width is" << reader->GetWidth() << endl;
	cout << "The height is" << reader->GetHeight() << endl;
	cout << "The depth is" << reader->GetPixelSpacing() << endl;
	cout << "The Output port is" << reader->GetOutputPort() << endl;

	
	vtkSmartPointer<vtkMarchingCubes> marchingcube = vtkSmartPointer<vtkMarchingCubes>::New();
	marchingcube->SetInputConnection(reader->GetOutputPort());//获得读取的数据的点集;
	marchingcube->SetValue(0, 200);//Setting the threshold;
	marchingcube->ComputeNormalsOn();//计算表面法向量;

	vtkSmartPointer<vtkStripper> Stripper = vtkSmartPointer<vtkStripper>::New();
	Stripper->SetInputConnection(marchingcube->GetOutputPort());//获取三角片

	vtkSmartPointer<vtkPolyDataMapper> Mapper = vtkSmartPointer<vtkPolyDataMapper>::New();//将三角片映射为几何数据;
	Mapper->SetInputConnection(Stripper->GetOutputPort());
	Mapper->ScalarVisibilityOff();//


	vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();//Created a actor;
	actor->SetMapper(Mapper);//获得皮肤几何数据
	actor->GetProperty()->SetDiffuseColor(1, .49, .25);//设置皮肤颜色;
	actor->GetProperty()->SetSpecular(0.3);//反射率;
	actor->GetProperty()->SetOpacity(1.0);//透明度;
	actor->GetProperty()->SetSpecularPower(20);//反射光强度;
	actor->GetProperty()->SetColor(1, 0, 0);//设置角的颜色;
	actor->GetProperty()->SetRepresentationToWireframe();//线框;

	//vtkSmartPointer<vtkCamera> camera = vtkSmartPointer<vtkCamera>::New();//Setting the Camera;
	//camera->SetViewUp(0, 0, -1);//设置相机向上方向;
	//camera->SetPosition(0, 1, 0);//位置:世界坐标系,相机位置;
	//camera->SetFocalPoint(0, 0, 0);//焦点,世界坐标系,控制相机方向;
	//camera->ComputeViewPlaneNormal();//重置视平面方向,基于当前的位置和焦点;

	vtkSmartPointer<vtkOutlineFilter> outfilterline = vtkSmartPointer<vtkOutlineFilter>::New();
	outfilterline->SetInputConnection(reader->GetOutputPort());
	vtkSmartPointer<vtkPolyDataMapper> outmapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	outmapper->SetInputConnection(outfilterline->GetOutputPort());
	vtkSmartPointer<vtkActor> OutlineActor = vtkSmartPointer<vtkActor>::New();
	OutlineActor->SetMapper(outmapper);
	OutlineActor->GetProperty()->SetColor(0, 0, 0);//线框颜色

	ren->AddActor(actor);
	ren->AddActor(OutlineActor);
	//ren->SetActiveCamera(camera);//设置渲染器的相机;
	ren->ResetCamera();
	ren->ResetCameraClippingRange();

	//camera->Dolly(1.5);//使用Dolly()方法延伸着视平面法向移动相机;
	ren->SetBackground(1, 1, 1);//设置背景颜色;
	renWin->SetSize(1000, 600);


	vtkInteractorStyleTrackballCamera *style = vtkInteractorStyleTrackballCamera::New();
	iren->SetInteractorStyle(style);

	renWin->Render();
	iren->Initialize();
	iren->Start();

	vtkSmartPointer<vtkOBJExporter> porter = vtkSmartPointer<vtkOBJExporter>::New();
	porter->SetFilePrefix("E:/ceshi/aaa/regist_after/polywrite.obj");//重建图像输出
	porter->SetInput(renWin);
	porter->Write();


	return EXIT_SUCCESS;
}

Snipaste_2020-04-08_18-43-54.jpg

上面就是 VTK 基于 Marching Cube算法实现的重建效果:

体绘制重建

体绘制时分为两部分:

1,定义 vtkVoluemRayCastMapper 对象

体绘制中最常用的方法 ;vtkVolumeRayCastMapper() 光线投影,体绘制时,首先定义一个Mapper 然后接受两个输入:

  • SetInput(vtkImageDate *) 用于设置输入图像数据;
  • SetVolumeRayCastFunction(vtkVolumeRayCastFunction *) 用于设置光线投影函数类型;
2,利用 vtkVolumeProperty 定义体绘制属性;
  • SetScalarOpacity() 设置灰度不透明函数;
  • SetColor() 颜色传输函数;
3, 定义 vtkVolume 对象接收 Mapper对象和 Property 对象
  • SetMapper()接受 Mapper 对象;
  • SetProperty() 接受 Property 对象;

vtk 中体绘制 核心就是改变 MappervtkVolumeRayCastFunction() ,上面中vtkColumeRayCastMapper 只是 VolumeMapper 其中的一种,且投影函数类 vtkVolumeRayCastFunction 一共有三个子类:

  • vtkVolumeRayCastCompositeFunction
  • vtkVolumeRayCasMIPFunction、
  • vtkVolumeRayCastIsosurfaceFunction
  • 因此,其细分的话vtk中的体绘制也不止一种

而下面这个是最常用到的(``vtkVolumeRayCastMapper+vtkVolumeRayCastCompositeFunction`)

//体绘制

#include<vtkRenderWindowInteractor.h>
#include<vtkDICOMImageReader.h>
#include<vtkCamera.h>
#include<vtkActor.h>
#include<vtkRenderer.h>
#include<vtkVolumeProperty.h>
#include<vtkProperty.h>
#include<vtkPolyDataNormals.h>
#include<vtkImageShiftScale.h>
#include "vtkVolumeRayCastMapper.h"
#include<vtkPiecewiseFunction.h>
#include<vtkColorTransferFunction.h>
#include<vtkVolumeRayCastCompositeFunction.h>
#include<vtkRenderWindow.h>
#include<vtkImageCast.h>
#include<vtkVolumeRayCastCompositeFunction.h>
#include<vtkOBJExporter.h>
#include<vtkOutlineFilter.h>
#include<vtkPolyDataMapper.h>



#include<vtkInteractorStyleTrackballCamera.h>
#include<vtkRenderingVolumeOpenGL2ObjectFactory.h>
#include<vtkRenderingOpenGL2ObjectFactory.h>
#include<vtkMetaImageReader.h>

#include<vtkLODProp3D.h>


//体绘制加速

//Gpu光照映射
#include<vtkGPUVolumeRayCastMapper.h>

#include<iostream>

int main()
{

	vtkObjectFactory::RegisterFactory(vtkRenderingOpenGL2ObjectFactory::New());
	vtkObjectFactory::RegisterFactory(vtkRenderingVolumeOpenGL2ObjectFactory::New());

	
	//定义绘制器;
	vtkRenderer *aRenderer = vtkRenderer::New();//指向指针;
	vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
	renWin->AddRenderer(aRenderer);
	
	vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
	iren->SetRenderWindow(renWin);
	
	//读取数据;
	/*vtkDICOMImageReader *reader = vtkDICOMImageReader::New();
	reader->SetDirectoryName("E:/Coding Pra/VTK/VTK_Examples_StandardFormats_Input_DicomTestImages/DICOM");
	reader->SetDataByteOrderToLittleEndian();*/


	vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New();
	reader->SetDirectoryName("E:/DIcom_Data/DICOM");
	reader->SetDataByteOrderToLittleEndian();




	//图像数据预处理,类型转换:通过 vtkimageCast 将不同类型数据集转化为 vtk 可以处理的数据集;
	vtkImageCast *cast_file = vtkImageCast::New();
	cast_file->SetInputConnection(reader->GetOutputPort());
	cast_file->SetOutputScalarTypeToUnsignedShort();
	cast_file->Update();

	
	//透明度映射函数定义;
	vtkPiecewiseFunction *opacityTransform = vtkPiecewiseFunction::New();
	opacityTransform->AddPoint(0, 0.0);
	opacityTransform->AddPoint(20, 0.0);
	opacityTransform->AddPoint(200, 1.0);
	opacityTransform->AddPoint(300, 1.0);

	//颜色映射函数定义,梯度上升的
	vtkColorTransferFunction *colorTransformFunction = vtkColorTransferFunction::New();
	colorTransformFunction->AddRGBPoint(0.0, 0.0, 0.0, 0.0);
	colorTransformFunction->AddRGBPoint(64.0, 0.0, 0.0, 0.0);
	colorTransformFunction->AddRGBPoint(128.0, 1.0, 0.0, 0.0);
	colorTransformFunction->AddRGBPoint(192.0, 1.0, 0.0, 0.0);
	colorTransformFunction->AddRGBPoint(255.0, 1.0, 0.0, 0.0);

	vtkPiecewiseFunction *gradientTransform = vtkPiecewiseFunction::New();
	gradientTransform->AddPoint(0, 0.0);

	gradientTransform->AddPoint(20, 2.0);
	gradientTransform->AddPoint(200, 0.1);
	gradientTransform->AddPoint(300, 0.1);


	
	//体数据属性;
	vtkVolumeProperty *volumeProperty = vtkVolumeProperty::New();
	volumeProperty->SetColor(colorTransformFunction);
	volumeProperty->SetScalarOpacity(opacityTransform);
	volumeProperty->SetGradientOpacity(gradientTransform);
	volumeProperty->ShadeOn();//应用
	volumeProperty->SetInterpolationTypeToLinear();//直线间样条插值;
	volumeProperty->SetAmbient(0.4);//环境光系数;
	volumeProperty->SetDiffuse(0.6);//漫反射;
	volumeProperty->SetSpecular(0.2);
	volumeProperty->SetSpecularPower(10);//高光强度;


	计算光照效应;利用 vtkBolumeRayCaseMapper进行计算;
	//vtkVolumeRayCastMapper *volunemapper = vtkVolumeRayCastMapper::New();
	//vtkVolumeRayCastCompositeFunction *compositeFunction = vtkVolumeRayCastCompositeFunction::New();


	//光纤映射类型定义:
	vtkSmartPointer<vtkVolumeRayCastCompositeFunction> compositecast =
		vtkSmartPointer<vtkVolumeRayCastCompositeFunction>::New();

	//Mapper定义,
	vtkSmartPointer<vtkVolumeRayCastMapper> hiresMapper = 
		vtkSmartPointer<vtkVolumeRayCastMapper>::New();
	hiresMapper->SetInputData(cast_file->GetOutput());
	hiresMapper->SetVolumeRayCastFunction(compositecast);
	
	
	vtkSmartPointer<vtkLODProp3D> prop = vtkSmartPointer<vtkLODProp3D>::New();
	prop->AddLOD(hiresMapper,volumeProperty,0.0);

	//
	//volunemapper->SetVolumeRayCastFunction(compositeFunction);//载入体绘制方法;
	//volunemapper->SetInputConnection(cast_file->GetOutputPort());

	//vtkFixedPointVolumeRayCastMapper *fixedPointVolumeMapper = vtkFixedPointVolumeRayCastMapper::New()
	//fixedPointVolumeMapper->SetInput()

	
	
	vtkVolume *volume = vtkVolume::New();
	volume->SetMapper(hiresMapper);
	volume->SetProperty(volumeProperty);//设置体属性;
	
	double volumeView[4] = { 0,0,0.5,1 };

	vtkOutlineFilter *outlineData = vtkOutlineFilter::New();//线框;
	outlineData->SetInputConnection(reader->GetOutputPort());
	vtkPolyDataMapper *mapOutline = vtkPolyDataMapper::New();
	mapOutline->SetInputConnection(outlineData->GetOutputPort());
	vtkActor *outline = vtkActor::New();
	outline->SetMapper(mapOutline);
	outline->GetProperty()->SetColor(0, 0, 0);//背景纯黑色;

	aRenderer->AddVolume(volume);
	aRenderer->AddActor(outline);
	aRenderer->SetBackground(1, 1, 1);
	aRenderer->ResetCamera();


	//重设相机的剪切范围;
	aRenderer->ResetCameraClippingRange();
	renWin->SetSize(800, 800);
	renWin->SetWindowName("测试");
	
	vtkRenderWindowInteractor *iren2 = vtkRenderWindowInteractor::New();
	iren2->SetRenderWindow(renWin);

	//设置相机跟踪模式
	vtkInteractorStyleTrackballCamera *style = vtkInteractorStyleTrackballCamera::New();
	iren2->SetInteractorStyle(style);
	
	renWin->Render();
	iren2->Initialize();
	
	iren2->Start();

	vtkOBJExporter *porter = vtkOBJExporter::New();
	porter->SetFilePrefix("E:/ceshi/aaa/regist_after/esho.obj");
	porter->SetInput(renWin);
	porter->Write();
	porter->Update();

	
	return EXIT_SUCCESS;

}

Snipaste_2020-04-08_20-05-07.jpg

上面是体绘制的结果,相对来说体绘制需要计算资源更大些, vtk 在这方面有所考虑,提供了vtKGPUVolumeRayCastMapper GUP 加速的光线投射算法。

以上就是本篇文章的全部内容,最后感谢阅读!

欢迎交流与联系,文章首发于公众号 (小张Python)

Reference:

https://blog.csdn.net/wp_veil/article/details/7047537;

https://blog.csdn.net/www_doling_net/article/details/44960713

`

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

分别用 VTK 体绘制和面绘制来实现医学图像三维重建 的相关文章

  • 为什么 dataclasses.astuple 返回类属性的深层副本?

    在下面的代码中astuple函数正在执行数据类的类属性的深层复制 为什么它不能产生与函数相同的结果my tuple import copy import dataclasses dataclasses dataclass class Dem
  • PyQt 使用 ctrl+Enter 触发按钮

    我正在尝试在我的应用程序中触发 确定 按钮 我当前尝试的代码是这样的 self okPushButton setShortcut ctrl Enter 然而 它不起作用 这是有道理的 我尝试查找一些按键序列here http ftp ics
  • Pycharm 在 os.path 连接上出现“未解析的引用”

    将pycharm升级到2018 1 并将python升级到3 6 5后 pycharm报告 未解析的引用 join 最新版本的 pycharm 不会显示以下行的任何警告 from os path import join expanduser
  • 为什么一旦我离开内置的运行服务器,Django 就无法找到我的管理媒体文件?

    当我使用内置的简单服务器时 一切正常 管理界面很漂亮 python manage py runserver 但是 当我尝试使用 wsgi 服务器为我的应用程序提供服务时django core handlers wsgi WSGIHandle
  • 使用 python/numpy 重塑数组

    我想重塑以下数组 gt gt gt test array 11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44 为了得到 gt gt gt test2 array 11 12 21 22 13 14
  • 未知错误:Chrome 无法启动:异常退出

    当我使用 chromedriver 对 Selenium 运行测试时 出现此错误 selenium common exceptions WebDriverException Message unknown error Chrome fail
  • Django 视图中的“请求”是什么

    在 Django 第一个应用程序的 Django 教程中 我们有 from django http import HttpResponse def index request return HttpResponse Hello world
  • 如何将 ascii 值列表转换为 python 中的字符串?

    我在 Python 程序中有一个列表 其中包含一系列数字 这些数字本身就是 ASCII 值 如何将其转换为可以在屏幕上回显的 常规 字符串 您可能正在寻找 chr gt gt gt L 104 101 108 108 111 44 32 1
  • Pandas 组合不同索引的数据帧

    我有两个数据框df 1 and df 2具有不同的索引和列 但是 有一些索引和列重叠 我创建了一个数据框df索引和列的并集 因此不存在重复的索引或列 我想填写数据框df通过以下方式 for x in df index for y in df
  • Python - 如何确定解析的 XML 元素的层次结构级别?

    我正在尝试使用 Python 解析 XML 文件中具有特定标记的元素并生成输出 excel 文档 该文档将包含元素并保留其层次结构 我的问题是我无法弄清楚每个元素 解析器在其上迭代 的嵌套深度 XML 示例摘录 3 个元素 它们可以任意嵌套
  • Django REST Framework - CurrentUserDefault 使用

    我正在尝试使用CurrentUserDefault一个序列化器的类 user serializers HiddenField default serializers CurrentUserDefault 文档说 为了使用它 请求 必须作为
  • Python GTK+ 画布

    我目前正在通过 PyGobject 学习 GTK 需要画布之类的东西 我已经搜索了文档 发现两个小部件似乎可以完成这项工作 GtkDrawingArea 和 GtkLayout 我需要一些基本函数 如 fillrect 或 drawline
  • MySQL 转储未知选项“-no-beep”

    在旧服务器上我使用了mysql转储命令来备份 MySQL 数据库 在新服务器上 MySQL 版本为 5 6 相同的命令给出了错误 unknown option no beep 无论它插入什么 我也在互联网上搜索过 但找不到任何帮助 在 my
  • 在 Google App Engine 中,如何避免创建具有相同属性的重复实体?

    我正在尝试添加一个事务 以避免创建具有相同属性的两个实体 在我的应用程序中 每次看到新的 Google 用户登录时 我都会创建一个新的播放器 当新的 Google 用户在几毫秒内进行多个 json 调用时 我当前的实现偶尔会创建重复的播放器
  • PySpark groupByKey 返回 pyspark.resultiterable.ResultIterable

    我试图找出为什么我的 groupByKey 返回以下内容 0
  • 为什么 csv.DictReader 给我一个无属性错误?

    我的 CSV 文件是 200 Service 我放入解释器的代码是 snav csv DictReader open screennavigation csv delimiter print snav fieldnames 200 for
  • 内部 while 循环不工作

    这是我项目网页上的代码片段 这里我想显示用户选择的类别 然后想显示属于该类别的主题 在那里 用户可以拥有多个类别 这没有问题 我可以在第一个 while 循环中打印所有这些类别 问题是当我尝试打印主题时 结果只显示一行 但每个类别中有更多主
  • 等待子进程使用 os.system

    我用了很多os system在 for 循环内调用创建后台进程 如何等待所有后台进程结束 os wait告诉我没有子进程 ps 我使用的是Solaris 这是我的代码 usr bin python import subprocess imp
  • pandas.read_csv 将列名移动一倍

    我正在使用位于的 ALL zip 文件here http www fec gov disclosurep PDownload do 我的目标是用它创建一个 pandas DataFrame 但是 如果我跑 data pd read csv
  • pytest找不到模块[重复]

    这个问题在这里已经有答案了 我正在关注pytest 良好实践 https docs pytest org en latest explanation goodpractices html test discovery或者至少我认为我是 但是

随机推荐

  • 今日头条阅读量怎么刷_自动刷今日头条阅读量 头条号自己刷阅读量

    什么时间段发头条更容易有很多阅读量和推荐量 谢邀请 首先我不会像其他博主一样粘贴复制蹭浏览量 我讲的都是属于自己的干货 首先要看你属于什么领域 如果你是写情歌 美文这类文章 适合早上8 00点发送 如果你属于时尚 生活 影视 这类文章 适合
  • 漏洞复现-CVE-2022-24112 APISIX远程代码执行漏洞原理与复现

    目录 漏洞原理 漏洞描述 影响范围 apisix学习 漏洞复现 config yaml 环境搭建 exp代码 入侵检测与修复 总结 参考 漏洞原理 漏洞描述 An attacker can abuse the batch requests
  • jmeter模拟多用户并发

    目录 前言 一 100个真实的用户 二 100个用户同时登录 前言 JMeter可以轻松地模拟多用户并发 从而测试Web应用程序的性能和稳定性 一 100个真实的用户 1 一个账号模拟100虚拟用户同时登录和100账号同时登录 区别 1 1
  • 【Linux】TCP相关实验验证

    Linux 博客主页 一起去看日落吗 分享博主的在Linux中学习到的知识和遇到的问题 博主的能力有限 出现错误希望大家不吝赐教 分享给大家一句我很喜欢的话 看似不起波澜的日复一日 一定会在某一天让你看见坚持的意义 祝我们都能在鸡零狗碎里找
  • 2018年最应该关注的11个vue.js组件库

    根据最近的React库和Angular库的列表发展情况 2018年 这里统计有11个常用的vue js组件库 它们最有可能出现在你的下一个vue js应用程序的UI中 Vue js React and Angular NPM 2017下半年
  • 华为OD机试真题-垃圾短信识别【2023Q1】

    题目描述 大众对垃圾短信深恶痛绝 希望能对垃圾短信发送者进行识别 为此 很多软件增加了垃圾短信的识别机制 经分析 发现正常用户的短信通常具备交互性 而垃圾短信往往都是大量单向的短信 按照如下规则进行垃圾短信识别 本题中 发送者A符合以下条件
  • 毕业季:女生IT就业指南

    我们在判定职位前途的时候 要从以下两个方面入手 1 门槛较低 但上限天花板要高 2 市场广阔 发展潜力要大 根据这两个准则 我得到了一个结论 自媒体将成为未来比较受欢迎的职业 或者说整个互联网行业 1 UI设计 UI设计非常注重细节和美感
  • 服务器数据库查看版本信息,查看服务器的数据库版本信息

    查看服务器的数据库版本信息 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 GaussDB for MySQL 全兼容My
  • 如何解决谷歌云盘wget无法下载大文件的问题

    如何解决谷歌云盘wget无法下载大文件的问题 wget指令 大文件 小文件 wget指令 最近在用谷歌云盘下载较大的数据集的时候 发现常常因为下载文件过大 无法直接用wget下载 多方查找资料之后确定了一个可行的路径 分享给大家 也作为记录
  • centos8.2+Tesla T4搭建深度学习运行环境

    因为工作需要 租借了腾讯云服务器 购买的配置是centos 8 2系统 512G的存储空间 另外显卡是Tesla T4 20核CPU 80G内存 在此基础上搭建深度学习的运行环境 将要安装pytorch和tensorflow开发框架 1 安
  • C# dll代码混淆加密

    目录 一 需求 二 用法 1 新建C 项目 2 开始加密 3 常见的错误 4 添加加密规则 5 导出加密dll 6 调用加密dll 结束 一 需求 C 项目生成 dll 在反编译工具下 好比皇帝的新装 dll 内部的代码看的一清二楚 在这里
  • 【python基础知识】7.实操-用Python实现“文字PK”小游戏(一)

    用 Python实现 文字PK 小游戏 前言 明确项目目标 分析过程 拆解项目 逐步执行 代码实现 版本1 0 自定属性 人工PK 版本2 0 随机属性 自动PK 版本3 0 打印战果 三局两胜 前言 我想先和你谈谈一个项目一般是怎么完成的
  • Bootstarp入门教程(4) 排版(1)

    1 标题 HTML中的所有标题标签 从 h1 到 h6 均可用 div class container div class row h1 h1 Bootstrap heading h1 h2 h2 Bootstrap heading h2
  • pkg-config 编译安装

    由于大部分的开源工程都需要用到pkg config 因此今天在这讲解一下pkg config for mac 安装过程 1 检测环境是否已安装pkg config 再命令行中输入 pkg config 若未安装 则提示命令未找到 2 安装p
  • CentOS 7安装DastDfs

    1 安装gcc 编译时需要 FastDFS是C语言开发 安装FastDFS需要先将官网下载的源码进行编译 编译依赖gcc环境 如果没有gcc环境 需要安装gcc yum install y gcc gcc c 2 安装libevent 运行
  • 文件包含漏洞学习

    一 文件包含简介 开发人员都希望代码更加灵活 所以通常会将被包含的文件设置为变量 用来进行动态调用 正是这种灵活性 从而导致客户端可以调用一个恶意文件 造成文件包含漏洞 1 文件包含函数 PHP中文件包含函数有以下四种 require re
  • H5 Canvas与SVG的比较

    转载 https www w3school com cn html5 html 5 canvas vs svg asp 两者都能够在在浏览器中绘图 但两者之间还是不一样的 Canvas 通过Javascript来绘制2D图形 是逐像素进行渲
  • STM32HAL库和STC51同时操作多个IO口

    STM32同时将PC13 PC14 PC15拉低 拉高 根据 define GPIO PIN 13 uint16 t 0x2000U Pin 13 selected define GPIO PIN 14 uint16 t 0x4000U P
  • R语言注意事项列表

    R语言注意事项列表 R语言是一种功能强大且广泛使用的编程语言 特别适用于数据分析和统计建模 在使用R语言进行编程和数据处理时 以下是一些需要注意的事项 以帮助您更有效地使用该语言 使用合适的注释 在编写R代码时 使用注释来解释代码的功能和目
  • 分别用 VTK 体绘制和面绘制来实现医学图像三维重建

    关注公众号 小张Python 为你准备了 50 本Python 精品电子书籍 与 50G 优质视频学习资料 后台回复关键字 1024 即可获取 如果对博文内容有什么疑问 后台添加作者 个人微信 可与作者直接进行交流 序言 VTK介绍 VTK