文章目錄
- 前言
- 預期效果
- 實作程序
- 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.滑鼠按下或滑鼠按下且移動時修改矩形框覆寫的像素的像素值
/**
* 這個例子中 n == 5 ,n = 2 * size +1
* 像素值在[range[0],range[1]]范圍內的像素值會被修改
*/
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已經被修改,
總結
介紹了矩形框擦除像素的大體實作流程和關鍵代碼,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/172452.html
標籤:其他
上一篇:聯發科MTK6765安卓核心板 helio P35資料分享學習
下一篇:有一起開發軟體的嗎?
