Библиотека Imebra показывает полностью серое изображение для передачи синтаксиса 1.2.840.10008.1.2.1 - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь использовать библиотеку Imebra для отображения изображений DICOM в android. Я использую версию 5.0 библиотеки. Показанное растровое изображение полностью серого цвета, синтаксис передачи для изображения - 1.2.840.10008.1.2.1. Для другого поддерживаемого синтаксиса передачи, например JPEG, он работает нормально.

enter image description here

Также я не могу добавить функциональность преобразования VOILUT, как упомянуто в документации. Она дает ошибку, которая не найдена для VOILUT.

enter image description here

Ниже приведен код Я использую, часть преобразования VOILUT дает конструктор не найден. если я удаляю часть преобразования VOILUT, все работает нормально, но для изображения с синтаксисом передачи 1.2.840.10008.1.2.1 оно показывает полностью серое изображение

    private Bitmap fromDicom(String filePath, int frameNumber){

    // have been applied).
    Image dicomImage = loadedDataSet.getImageApplyModalityTransform(frameNumber);

    // Use a DrawBitmap to build a stream of bytes that can be handled by the
    // Android Bitmap class.
    com.imebra.TransformsChain chain = new com.imebra.TransformsChain();


    if( com.imebra.ColorTransformsFactory.isMonochrome(dicomImage.getColorSpace()))
    {
        // Retrieve the VOIs (center/width pairs)

        com.imebra.VOIs vois = loadedDataSet.getVOIs();

        if(!vois.isEmpty())
        {
            // Get the first VOI setting from the dataset
            chain.addTransform(new VOILUT(vois.get(0)));
        }
        else
        {
            // The dataset does not have any VOI setting, find the optimal one
            com.imebra.SWIGTYPE_p_imebra__VOIDescription voiDescription = VOILUT.getOptimalVOI(dicomImage, 0, 0, dicomImage.getWidth(), dicomImage.getHeight());
            chain.addTransform(new VOILUT(voiDescription));
        }

    }

    DrawBitmap drawBitmap = new DrawBitmap(chain);
    Memory memory = drawBitmap.getBitmap(dicomImage, drawBitmapType_t.drawBitmapRGBA, 4);

    // Build the Android Bitmap from the raw bytes returned by DrawBitmap.
    Bitmap renderBitmap = Bitmap.createBitmap((int)dicomImage.getWidth(), (int)dicomImage.getHeight(), Bitmap.Config.ARGB_8888);
    byte[] memoryByte = new byte[(int)memory.size()];
    memory.data(memoryByte);
    ByteBuffer byteBuffer = ByteBuffer.wrap(memoryByte);
    renderBitmap.copyPixelsFromBuffer(byteBuffer);
    // Update the image
    return renderBitmap;

}

После изменения предложенного вами кода я не нахожу классов упомянутое

VOIDescription вместо этого я вижу класс SWIGTYPE_p_imebra__VOIDescription, если я использую этот класс

enter image description here

Существует еще одна ошибка, недоступный метод getWidth () с vois.get (0) .getWidth

enter image description here

Одна последняя ошибка. Я не вижу класса vois_t, вместо этого есть VOI класса, если VOI следует использовать

Спасибо за отклик

1 Ответ

1 голос
/ 30 апреля 2020

VOILUT должен быть инициализирован с правильными настройками контрастности из набора данных, как показано в коде ниже.

Однако набор данных содержит неправильную настройку VOI (ширина окна 0) поэтому этот файл будет отображаться правильно, только если вы используете пользовательские настройки VOI или просто используете автоматические c настройки, когда ширина равна нулю (см. Альтернативный код ниже, который проверяет ширину> 0).

Код, который не проверяет ширину:

if(com.imebra.ColorTransformsFactory.isMonochrome(dicomImage.getColorSpace());
{
    // Retrieve the VOIs (center/width pairs)
    com.imebra.vois_t vois = loadedDataSet.getVOIs();

    if(!vois.isEmpty())
    {
        // Get the first VOI setting from the dataset
        chain.addTransform(new VOILUT(vois.get(0)));
    }
    else
    {
        // The dataset does not have any VOI setting, find the optimal one
        com.imebra.VOIDescription voiDescription = VOILUT.getOptimalVOI(dataSetImage, 0, 0, width, height);
        chain.addTransform(new VOILUT(voiDescription));
    }

}

Альтернативный код, который проверяет, является ли ширина 0:

if(com.imebra.ColorTransformsFactory.isMonochrome(dicomImage.getColorSpace());

{
    // Retrieve the VOIs (center/width pairs)
    com.imebra.vois_t vois = loadedDataSet.getVOIs();

    if(!vois.isEmpty() && vois.get(0).getWidth() > 0.1)
    {
        // Get the first VOI setting from the dataset
        chain.addTransform(new VOILUT(vois.get(0)));
    }
    else
    {
        // The dataset does not have any VOI setting, find the optimal one
        com.imebra.VOIDescription voiDescription = VOILUT.getOptimalVOI(dataSetImage, 0, 0, width, height);
        chain.addTransform(new VOILUT(voiDescription));
    }

}
...