1

我正在使用 Qt + VTK 开发 C++ 应用程序。实际上,我有一个 QVTKWidget,用于显示 DICOM 图像。我使用了带有vtkInteractorStyleImagevtkImageViewer2,因此我可以通过在按下左键的同时用鼠标单击图像来更改图像的亮度和对比度。

但是,我希望启用一个按钮以恢复其原始值的亮度和对比度。我已经进行了一些研究,但是在文档中找不到任何有关它的功能,也找不到可以在运行时更改的任何已保存的亮度和对比度值。

我希望有人能帮帮忙。谢谢你。

4

1 回答 1

0

按照这个例子,我可以把这段代码放在一起:

void MainWindow::on_luminosityResetButton_clicked()
{
    vtkSmartPointer<vtkImageShiftScale> shiftScaleFilter = 
    vtkSmartPointer<vtkImageShiftScale>::New();
    shiftScaleFilter->SetOutputScalarTypeToUnsignedChar();
    #if VTK_MAJOR_VERSION <= 5
        shiftScaleFilter->SetInputConnection(imageData->GetProducerPort());
    #else
        shiftScaleFilter->SetInputData(imageData);
    #endif
    shiftScaleFilter->SetShift(0);
    shiftScaleFilter->SetScale(0);
    shiftScaleFilter->Update();

    // Create actors
    vtkSmartPointer<vtkImageSliceMapper> originalSliceMapper = vtkSmartPointer<vtkImageSliceMapper>::New();
    #if VTK_MAJOR_VERSION <= 5
        originalSliceMapper->SetInputConnection(imageData->GetProducerPort());
    #else
        originalSliceMapper->SetInputData(imageData);
    #endif

    vtkSmartPointer<vtkImageSlice> originalSlice = vtkSmartPointer<vtkImageSlice>::New();
    originalSlice->SetMapper(originalSliceMapper);

    vtkSmartPointer<vtkImageSliceMapper> shiftScaleMapper = vtkSmartPointer<vtkImageSliceMapper>::New();
    shiftScaleMapper->SetInputConnection(shiftScaleFilter->GetOutputPort());

    vtkSmartPointer<vtkImageSlice> shiftScaleSlice = vtkSmartPointer<vtkImageSlice>::New();
    shiftScaleSlice->SetMapper(shiftScaleMapper);
    shiftScaleSlice->GetProperty()->SetInterpolationTypeToNearest();

    renderer->AddViewProp(originalSlice);

    vtkSmartPointer<vtkRenderer> shiftScaleRenderer =
        vtkSmartPointer<vtkRenderer>::New();
    shiftScaleRenderer->AddViewProp(shiftScaleSlice);

    ui->qvtkWidget->update();
}

现在它起作用了(亮度和对比度获得了它们的原始值),但我还没有完全理解其背后的逻辑。所以,我没有将自己的答案标记为正确的答案(希望获得更中肯的答案),但我还是发布了它。我在其他地方看到了同样的问题(未回答),我希望它对其他人有用。

于 2013-08-27T14:44:35.780 回答