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

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

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

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


person Andrea    schedule 26.06.2013    source источник
comment
вы пытались получить/setColorLevel и получить/setColorWindow?   -  person QT-ITK-VTK-Help    schedule 17.07.2013
comment
Большое спасибо за вашу помощь, и извините за поздний ответ. Однако, к сожалению, это не работает. Я пробовал с этим кодом: void MainWindow::on_luminosityResetButton_clicked(){ imageViewer->SetColorLevel(128); imageViewer->SetColorWindow(255); ui->qvtkWidget->update(); } , где imageViewer — это глобальная переменная типа vtkSmartPointer‹vtkImageViewer2›. Но он просто делает что угодно. Эти функции имеют смысл (я также пробовал их с разными значениями, результат тот же), может быть, я просто что-то забыл, чтобы заставить их работать...   -  person Andrea    schedule 21.07.2013


Ответы (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();
}

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

person Andrea    schedule 27.08.2013