Как восстановить яркость и контрастность в ВТК?

Я занимаюсь разработкой приложения на C++, используя Qt + VTK. На самом деле, у меня есть QVTKWidget, используемый для отображения изображения DICOM. Я использовал vtkImageViewer2 с vtkInteractorStyleImage, поэтому я могу изменять яркость и контрастность изображения, щелкая по нему мышью, пока нажата левая кнопка.

Однако я хочу включить кнопку для восстановления яркости и контрастности при их исходных значениях. Я провел какое-то исследование, но не могу найти ни функции, касающейся этого, в документации, ни сохраненных значений яркости и контрастности, которые я могу изменить во время выполнения.

Я надеюсь, что кто-то может помочь. Спасибо.

1 ответ

Решение

Следуя этому примеру, я смог поместить этот код вместе:

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();
}

Теперь это работает (яркость и контраст получают первоначальные значения), но я не совсем понял логику этого. Таким образом, я не помечаю свой собственный ответ как правильный (в надежде получить более подходящий ответ), но все равно выкладываю его. Я видел эту же проблему (без ответа) в другом месте, и я надеюсь, что она может быть полезна для других.

Другие вопросы по тегам