基于VTK和QT实现DICOM图像的像素擦除

   日期:2020-10-14     浏览:186    评论:0    
核心提示:基于VTK和QT实现DICOM图像的像素擦除

文章目录

  • 前言
  • 预期效果
  • 实现过程
    • 1.创建矩形框
    • 2.更新矩形框的位置,使其跟随鼠标移动
    • 3.鼠标按下或鼠标按下且移动时修改矩形框覆盖的像素的像素值
  • 总结

前言

在医学图像分割领域有许多自动分割方法,但自动分割方法并不能适用所有的情况,有时必须借助交互工具去擦除或新增一些像素,来达到理想的分割效果。这里介绍一种用矩形框擦除像素的方法。

预期效果

实现过程

1.创建矩形框

这里创建了一个与Z轴垂直,大小为5像素×5像素大小的矩形框。

vtkSmartPointer<vtkPlaneSource> plane = vtkSmartPointer<vtkPlaneSource>::New();
plane->SetCenter(0, 0, 0);
plane->SetNormal(0.0, 0, 1);
plane->Update();
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(plane->GetOutputPort());
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
box[i]->SetMapper(mapper);
box[i]->GetProperty()->SetColor(1.0, 0, 0);
box[i]->SetScale(5*space[0],5*space[1],1);//space是像素间隔
box[i]->SetPickable(false);
box[i]->GetProperty()->SetRepresentationToWireframe();
box[i]->GetProperty()->SetEdgeColor(1.0, 1.0, 0.0);
box[i]->GetProperty()->SetEdgeVisibility(true);
box[i]->GetProperty()->SetLineWidth(2.0);
box[i]->GetProperty()->SetRenderLinesAsTubes(true);

2.更新矩形框的位置,使其跟随鼠标移动

首先获取鼠标的视口坐标,利用vtkCellPicker进行射线检测,获取射线与图像的交点picked:

size = this->ui->openGLWidgetRT->size();
double picked[3];
vtkSmartPointer<vtkCellPicker> cellPicker =
	vtkSmartPointer<vtkCellPicker>::New();
cellPicker->SetTolerance(0.005);
cellPicker->Pick(x, size.height() - y - 1, 0, render);
cellPicker->GetPickPosition(picked);
if (cellPicker->GetPointId() < 0) return;

其次计算交点picked所在的像素的索引[sliceX, sliceY]:

picked[0] = picked[0] - origin[0];//origin是图像的原点
picked[1] = picked[1] - origin[1];

int sliceX = picked[0] / space[0];
double deltX = picked[0] - sliceX * space[0];
if (deltX > space[0] / 2.0) sliceX++;

int sliceY = picked[1] / space[1];
double deltY = picked[1] - sliceY * space[1];
if (deltY > space[1] / 2.0)	sliceY++;

最后计算并设置矩形框的位置:

double posX = sliceX * space[0] + origin[0];
double posY = sliceY * space[1] + origin[1];
actor->SetPosition(posX, posY, posZ);//posZ应大于图像的Z坐标,避免矩形框被图像遮挡

注意:上述计算方法适用于CT图像,CT图像的边界只有半个像素大小,针对其他图像的计算方法类似。利用上述步骤来设置矩形框的位置而不直接把交点picked设置为矩形框的位置,其目的是为了使矩形框的边界始终与像素的边界对齐。

3.鼠标按下或鼠标按下且移动时修改矩形框覆盖的像素的像素值


for (int i = 0; i < n; ++i)
{ 
	for (int j = 0; j < n; ++j)
	{ 
		short int* pixel = (short int*)(image->GetScalarPointer(sliceX - size + j, sliceY - size +i, sliceZ));
		if (*(pixel) >= range[0] && *(pixel ) <= range[1])
			*(pixel) = 0;
	}
}
image->Modified();

修改完图像之后记得调用Image的Modified()方法,告诉渲染管线image已经被修改。

总结

介绍了矩形框擦除像素的大体实现流程和关键代码。

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服