基于C++的水灵VTK8学习笔记2(VTK图像处理)

VTK资料分享:张晓东的《VTK图形图像开发进阶》全套资料(包含书籍电子版,配套每章节所有源码、实现效果图和工程配置文件)

水灵VTK学习全套资料(包含全部视频、PPT、源码和每个项目对应的工程配置文件CmakeLists.txt)

水灵VT视频在线观看
本文参考的主要是张晓东的《VTK图形图像开发进阶》和水灵的视频Study VTK Together。使用的平台是VS2019+VTK8.2

 

VTK系列目录:

1 VTK基本概念

2 VTK图像处理

3 VTK图形处理

4 VTK体绘制

 

2 VTK图像处理

实例19:用vtkImageCanvasSource2D创建图像
实例20:用vtkImageViewer2显示三维医学图像mhd的某个切面

实例21:BMP图像信息的访问(图像维数、原点坐标和像素间隔)
实例22:JPG图像信息的访问(图像维数、原点坐标和像素间隔)
实例23:DCM医学图像信息的访问(图像维数、原点坐标和像素间隔)
实例24:BMP图像信息的修改(图像维数、原点坐标和像素间隔)
实例25:BMP图像像素值的访问与修改
实例26:将BMP类型的RGB图像转换为灰度图像
实例27:将BMP类型的RGB图像提取各个颜色(R、G、B)组分(提取颜色组分)
实例28:将JPG类型的灰度图像进行彩色映射(图像彩色映射)
实例29:多个灰度图像合成一个彩色图像(颜色合成)
实例30:提取BMP图像的感兴趣区域(区域提取)
实例31:灰度图像直方图
实例32:图像重采样(降采样)
实例33:图像重采样(降和升采样)
实例34:图像运算(数字运算)
实例35:图像运算(逻辑运算)
实例36:图像二值化
实例37:梯度算子(边缘检测)
实例38:Sobel梯度算子(边缘检测)
实例39:拉普拉斯算子(边缘检测)
实例40:均值滤波(图像光滑)
实例41:高斯平滑(图像光滑)
实例42:中值滤波(图像光滑)
实例43:各向异性滤波(图像光滑)
实例44:二维图像快速傅里叶变换(频域处理)
实例45:理想低通滤波器(频域处理)
实例46:巴特沃斯低通滤波器(频域处理)
实例47:理想高通滤波器(频域处理)
实例48:巴沃斯特高通滤波器(频域处理)

 

实例19:用vtkImageCanvasSource2D创建图像

#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);

#include <vtkSmartPointer.h>
#include <vtkImageData.h>
#include <vtkImageCanvasSource2D.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>
#include <vtkRenderer.h>
#include <vtkImageActor.h>

int main()
{
	//定义一个vtkImageCanvasSource2D类型对象canvas
	vtkSmartPointer<vtkImageCanvasSource2D> canvas =
		vtkSmartPointer<vtkImageCanvasSource2D>::New();
	//设置画布的像素数据类型为UnsignedChar
	canvas->SetScalarTypeToUnsignedChar();
	//设置组分数目
	canvas->SetNumberOfScalarComponents(1);
	//设置画布的大小
	canvas->SetExtent(0, 100, 0, 100, 0, 0);
	//利用SetDrawColor方法设置绘制矩形颜色
	canvas->SetDrawColor(0, 0, 0, 0);//黑色
	//利用FillBox方法在画布中绘制矩形
	canvas->FillBox(0,100,0,100);
	canvas->SetDrawColor(255, 0, 0, 0);//白色
	canvas->FillBox(20,40,20,40);
	canvas->Update();

	// Create actors
	vtkSmartPointer<vtkImageActor> redActor =
		vtkSmartPointer<vtkImageActor>::New();
	//redActor->SetInput(canvas->GetOutput());
	redActor->SetInputData(canvas->GetOutput());

	// Define viewport ranges
	// (xmin, ymin, xmax, ymax)
	double redViewport[4] = {0.0, 0.0, 1.0, 1.0};
	// Setup renderers
	vtkSmartPointer<vtkRenderer> redRenderer =
		vtkSmartPointer<vtkRenderer>::New();
	redRenderer->SetViewport(redViewport);
	redRenderer->AddActor(redActor);
	redRenderer->ResetCamera();
	redRenderer->SetBackground(1.0, 1.0, 1.0);

	// Setup render window
	vtkSmartPointer<vtkRenderWindow> renderWindow =
		vtkSmartPointer<vtkRenderWindow>::New();
	renderWindow->AddRenderer(redRenderer);
	renderWindow->SetSize( 640, 480 );
	renderWindow->Render();
	renderWindow->SetWindowName("ImageCanvasSource2D");

	// Setup render window interactor
	vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
		vtkSmartPointer<vtkRenderWindowInteractor>::New();
	vtkSmartPointer<vtkInteractorStyleImage> style =
		vtkSmartPointer<vtkInteractorStyleImage>::New();

	renderWindowInteractor->SetInteractorStyle(style);
	// Render and start interaction
	renderWindowInteractor->SetRenderWindow(renderWindow);
	renderWindowInteractor->Initialize();
	renderWindowInteractor->Start();

	return EXIT_SUCCESS;
}

实例20:用vtkImageViewer2显示三维医学图像mhd的某个切面

#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);

#include <vtkSmartPointer.h>
#include <vtkImageViewer2.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkMetaImageReader.h>//mhd类图像处理类

//测试图像:../data/brain.mhd
int main(int argc, char* argv[])
{
	vtkSmartPointer<vtkMetaImageReader> reader =
		vtkSmartPointer<vtkMetaImageReader>::New();
	//注意:mhd和raw文件要放在同一个文件目录
	reader->SetFileName("C:\\Users\\Administrator\\Desktop\\VTK2\\hellovtk\\vtk_图像处理学习\\第五章_图像处理\\data\\brain.mhd");
	reader->Update();

	vtkSmartPointer<vtkImageViewer2> imageViewer =
		vtkSmartPointer<vtkImageViewer2>::New();
	imageViewer->SetInputData(reader->GetOutput());

	vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
		vtkSmartPointer<vtkRenderWindowInteractor>::New();
	imageViewer->SetupInteractor(renderWindowInteractor);

	imageViewer->SetColorLevel(500);//设置窗位为500
	imageViewer->SetColorWindow(2000);//设置窗宽为2000
	imageViewer->SetSlice(40);//设置切片索引
	imageViewer->SetSliceOrientationToXY();//设置切片方向
	imageViewer->Render();

	imageViewer->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
	imageViewer->SetSize(640, 480);
	imageViewer->GetRenderWindow()->SetWindowName("DisplayImageExample");

	renderWindowInteractor->Start();

	return EXIT_SUCCESS;
}

                           

实例21:BMP图像信息的访问(图像维数、原点坐标和像素间隔)

#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);

#include <vtkSmartPointer.h>
#include <vtkImageViewer2.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkImageReader2Factory.h>
#include <vtkImageReader2.h>
#include <vtkBMPReader.h>
#include <vtkImageData.h>

//测试图像:../data/lena.bmp
int main(int argc, char* argv[])
{
	/*if (argc < 2)
	{
		std::cout<<argv[0]<<" "<<"ImageFile(*.bmp)"<<std::endl;
		return EXIT_FAILURE;
	}*/
	vtkSmartPointer<vtkBMPReader> reader =
		vtkSmartPointer<vtkBMPReader>::New();
	//reader->SetFileName ( argv[1] );
	reader->SetFileName("1234.bmp");//读取图片
	reader->Update();

	int dims[3];
	reader->GetOutput()->GetDimensions(dims);
	std::cout<<"图像维数:" <<dims[0]<<" "<<dims[1]<<" "<<dims[2]<<std::endl;

	double origin[3];
	reader->GetOutput()->GetOrigin(origin);
	std::cout<<"图像原点:" <<origin[0]<<" "<<origin[1]<<" "<<origin[2]<<std::endl;

	double spaceing[3];
	reader->GetOutput()->GetSpacing(spaceing);
	std::cout<<"像素间隔:" <<spaceing[0]<<" "<<spaceing[1]<<" "<<spaceing[2]<<std::endl;

	vtkSmartPointer<vtkImageViewer2> imageViewer =
		vtkSmartPointer<vtkImageViewer2>::New();
	imageViewer->SetInputConnection(reader->GetOutputPort());

	vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
		vtkSmartPointer<vtkRenderWindowInteractor>::New();
	imageViewer->SetupInteractor(renderWindowInteractor);
	imageViewer->Render();
	imageViewer->GetRenderer()->ResetCamera();
	imageViewer->Render();

	imageViewer->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
	imageViewer->SetSize(640, 480);
	imageViewer->GetRenderWindow()->SetWindowName("GetImageInformationExample");

	renderWindowInteractor->Start();

	return EXIT_SUCCESS;
}

     

实例22:JPG图像信息的访问(图像维数、原点坐标和像素间隔)

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);

#include <vtkSmartPointer.h>
#include <vtkImageViewer2.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkImageReader2Factory.h>
#include <vtkImageReader2.h>
#include <vtkJPEGReader.h>//JPEG图像读取类
#include <vtkImageData.h>

//测试图像:../data/lena.jpg
int main(int argc, char* argv[])
{
	//实例化一个对象dcmReader
	vtkJPEGReader* reader = vtkJPEGReader::New();
	reader->SetFileName("lena.jpg");//读取图像

	reader->Update();

	int dims[3];
	reader->GetOutput()->GetDimensions(dims);
	std::cout << "图像维数:" << dims[0] << " " << dims[1] << " " << dims[2] << std::endl;

	double origin[3];
	reader->GetOutput()->GetOrigin(origin);
	std::cout << "图像原点:" << origin[0] << " " << origin[1] << " " << origin[2] << std::endl;

	double spaceing[3];
	reader->GetOutput()->GetSpacing(spaceing);
	std::cout << "像素间隔:" << spaceing[0] << " " << spaceing[1] << " " << spaceing[2] << std::endl;

	vtkSmartPointer<vtkImageViewer2> imageViewer =
		vtkSmartPointer<vtkImageViewer2>::New();
	imageViewer->SetInputConnection(reader->GetOutputPort());

	vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
		vtkSmartPointer<vtkRenderWindowInteractor>::New();
	imageViewer->SetupInteractor(renderWindowInteractor);
	imageViewer->Render();
	imageViewer->GetRenderer()->ResetCamera();
	imageViewer->Render();

	imageViewer->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
	imageViewer->SetSize(640, 480);
	imageViewer->GetRenderWindow()->SetWindowName("GetImageInformationExample");

	renderWindowInteractor->Start();

	return 0;
}

  

实例23:DCM医学图像信息的访问(图像维数、原点坐标和像素间隔)

#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);

#include <vtkSmartPointer.h>
#include <vtkImageViewer2.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkImageReader2Factory.h>
#include <vtkImageReader2.h>
//#include <vtkBMPReader.h>
#include <vtkImageData.h>
#include <vtkDICOMImageReader.h>//DCM医学文件读取类

//测试图像:../data/lena.bmp
int main(int argc, char* argv[])
{
	/*vtkSmartPointer<vtkBMPReader> reader =
		vtkSmartPointer<vtkBMPReader>::New();*/

	//实例化一个对象dcmReader
	vtkDICOMImageReader* reader = vtkDICOMImageReader::New();
	reader->SetFileName("C:\\Users\\Administrator\\Desktop\\VTK2\\hellovtk\\CT\\123.dcm");//读单张切片

	//reader->SetFileName("lena.bmp");//读取图片
	reader->Update();

	int dims[3];
	reader->GetOutput()->GetDimensions(dims);
	std::cout<<"图像维数:" <<dims[0]<<" "<<dims[1]<<" "<<dims[2]<<std::endl;

	double origin[3];
	reader->GetOutput()->GetOrigin(origin);
	std::cout<<"图像原点:" <<origin[0]<<" "<<origin[1]<<" "<<origin[2]<<std::endl;

	double spaceing[3];
	reader->GetOutput()->GetSpacing(spaceing);
	std::cout<<"像素间隔:" <<spaceing[0]<<" "<<spaceing[1]<<" "<<spaceing[2]<<std::endl;

	vtkSmartPointer<vtkImageViewer2> imageViewer =
		vtkSmartPointer<vtkImageViewer2>::New();
	imageViewer->SetInputConnection(reader->GetOutputPort());

	vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
		vtkSmartPointer<vtkRenderWindowInteractor>::New();
	imageViewer->SetupInteractor(renderWindowInteractor);
	imageViewer->Render();
	imageViewer->GetRenderer()->ResetCamera();
	imageViewer->Render();

	imageViewer->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
	imageViewer->SetSize(640, 480);
	imageViewer->GetRenderWindow()->SetWindowName("GetImageInformationExample");

	renderWindowInteractor->Start();

	return EXIT_SUCCESS;
}

          

实例24:BMP图像信息的修改(图像维数、原点坐标和像素间隔)

#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);

#include <vtkSmartPointer.h>
#include <vtkImageViewer2.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkBMPReader.h>
#include <vtkImageChangeInformation.h>
#include <vtkImageData.h>

//测试图像:../data/lena.bmp
int main(int argc, char* argv[])
{
	/*if (argc < 2)
	{
		std::cout<<argv[0]<<" "<<"ImageFile(*.bmp)"<<std::endl;
		return EXIT_FAILURE;
	}*/

	vtkSmartPointer<vtkBMPReader> reader =
		vtkSmartPointer<vtkBMPReader>::New();
	//reader->SetFileName(argv[1]);
	reader->SetFileName("lena.bmp");
	reader->Update();

	int dims[3];
	double origin[3];
	double spaceing[3];

	reader->GetOutput()->GetDimensions(dims);
	std::cout<<"原图像维数:" <<dims[0]<<" "<<dims[1]<<" "<<dims[2]<<std::endl;
	reader->GetOutput()->GetOrigin(origin);
	std::cout<<"原图像原点:" <<origin[0]<<" "<<origin[1]<<" "<<origin[2]<<std::endl;
	reader->GetOutput()->GetSpacing(spaceing);
	std::cout<<"原像素间隔:" <<spaceing[0]<<" "<<spaceing[1]<<" "<<spaceing[2]<<std::endl<<std::endl;;

	vtkSmartPointer<vtkImageChangeInformation> changer =
		vtkSmartPointer<vtkImageChangeInformation>::New();
	changer->SetInputData(reader->GetOutput());//
	changer->SetOutputOrigin(100, 100, 0);
	changer->SetOutputSpacing(5,5,1);
	changer->SetCenterImage(1);
	changer->Update();

	changer->GetOutput()->GetDimensions(dims);
	std::cout<<"修改后图像维数:" <<dims[0]<<" "<<dims[1]<<" "<<dims[2]<<std::endl;
	changer->GetOutput()->GetOrigin(origin);
	std::cout<<"修改后图像原点:" <<origin[0]<<" "<<origin[1]<<" "<<origin[2]<<std::endl;
	changer->GetOutput()->GetSpacing(spaceing);
	std::cout<<"修改后像素间隔:" <<spaceing[0]<<" "<<spaceing[1]<<" "<<spaceing[2]<<std::endl;

	vtkSmartPointer<vtkImageViewer2> imageViewer =
		vtkSmartPointer<vtkImageViewer2>::New();
	imageViewer->SetInputConnection(changer->GetOutputPort());
	vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
		vtkSmartPointer<vtkRenderWindowInteractor>::New();
	imageViewer->SetupInteractor(renderWindowInteractor);
	imageViewer->Render();
	imageViewer->GetRenderer()->ResetCamera();
	imageViewer->Render();

	imageViewer->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
	imageViewer->SetSize(640, 480);
	imageViewer->GetRenderWindow()->SetWindowName("ImageChangeInformationExample");


	renderWindowInteractor->Start();

	return EXIT_SUCCESS;
}

    

注:SetCenterImage函数作用是将(0,0,0)点置于图像的中心,所以本程序执行该函数时会从新调用SetOutputOrigin(),所以会覆盖上方设置的原点位置,如果想让本程序输出设定的原点位置为(100,100,0),只需屏蔽语句SetCenterImage(1)

实例25:BMP图像像素值的访问与修改

#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
#include <vtkSmartPointer.h>
#include <vtkImageViewer2.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkBMPReader.h>
#include <vtkImageData.h>
#include <vtkImageIterator.h>

//测试图像:../data/lena.bmp
int main(int argc, char* argv[])
{
	vtkSmartPointer<vtkBMPReader> reader =
	vtkSmartPointer<vtkBMPReader>::New();
	reader->SetFileName ( "lena.bmp" );
	reader->Update();

	int subRegion[6] = {0,300, 0, 300, 0, 0};
	vtkImageIterator<unsigned char> it(reader->GetOutput(), subRegion);

	while(!it.IsAtEnd())
	{
		unsigned char *inSI = it.BeginSpan();
		unsigned char *inSIEnd = it.EndSpan();

		while(inSI != inSIEnd)
		{
			*inSI = 255-*inSI;
			++inSI;
		}
		it.NextSpan();
	}

	vtkSmartPointer<vtkImageViewer2> imageViewer =
		vtkSmartPointer<vtkImageViewer2>::New();
	imageViewer->SetInputConnection(reader->GetOutputPort());

	vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
		vtkSmartPointer<vtkRenderWindowInteractor>::New();
	imageViewer->SetupInteractor(renderWindowInteractor);
	imageViewer->Render();
	imageViewer->GetRenderer()->ResetCamera();
	imageViewer->Render();

	imageViewer->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
	imageViewer->SetSize(640, 480);
	imageViewer->GetRenderWindow()->SetWindowName("VisitImagePixelIterativelyExample");

	renderWindowInteractor->Start();

	return 0;
}

实例26:将BMP类型的RGB图像转换为灰度图像

#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);

#include <vtkSmartPointer.h>
#include <vtkImageData.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>
#include <vtkRenderer.h>
#include <vtkImageActor.h>
#include <vtkBMPReader.h>
#include <vtkImageLuminance.h>

//测试图像:../data/lena.bmp
int main(int argc, char* argv[])
{
	vtkSmartPointer<vtkBMPReader> reader =
    vtkSmartPointer<vtkBMPReader>::New();
	reader->SetFileName ( "lena.bmp" );

	vtkSmartPointer<vtkImageLuminance> luminanceFilter = 
		vtkSmartPointer<vtkImageLuminance>::New();
	luminanceFilter->SetInputConnection(reader->GetOutputPort());
	luminanceFilter->Update();

	vtkSmartPointer<vtkImageActor> originalActor =
		vtkSmartPointer<vtkImageActor>::New();
	originalActor->SetInputData(reader->GetOutput());

	vtkSmartPointer<vtkImageActor> shiftscaleActor =
		vtkSmartPointer<vtkImageActor>::New();
	shiftscaleActor->SetInputData(luminanceFilter->GetOutput());

	double originalViewport[4] = {0.0, 0.0, 0.5, 1.0};
	double shiftscaleViewport[4] = {0.5, 0.0, 1.0, 1.0};

	vtkSmartPointer<vtkRenderer> originalRenderer =
		vtkSmartPointer<vtkRenderer>::New();
	originalRenderer->SetViewport(originalViewport);
	originalRenderer->AddActor(originalActor);
	originalRenderer->ResetCamera();
	originalRenderer->SetBackground(1.0, 1.0, 1.0);

	vtkSmartPointer<vtkRenderer> shiftscaleRenderer =
		vtkSmartPointer<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亦我飞也

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值