Изображение J 16 бит, подписанное буферизованное изображение

1

Итак, мой вопрос заключается в том, как получить 16 бит bufferedImage из ij.ImagePlus...? Если я пытаюсь использовать ShortProcessor, он меняет подписанное изображение на unsigned, поэтому я не получаю оригинальное изображение... Спасибо заранее, может ли кто-нибудь предоставить решение.

Изображение 174551

Как ImageJ отображает 16-битное подписанное изображение в своем средстве просмотра... и мы получаем только 8 бит bufferedImage или 16-битный unsigned bufferedImage. Так как я могу получить 16-битную подпись BufferedImage..?

  • 1
    Как получить подписанное 16-битное изображение в ImagePlus ? Насколько мне известно, ImageJ поддерживает только 16-битные изображения без знака . Что ImagePlus#getType() ?
  • 1
    @JanEglinger ImageJ поддерживает функции калибровки, которые можно использовать для «симуляции» подписанных 16-битных данных. Что может сделать kamlesh0606, так это вернуть неподписанное изображение BufferedImage, а затем преобразовать его в подписанное изображение BufferedImage, зациклив пиксели. Я сейчас слишком занят, чтобы написать это как правильный ответ ...
Показать ещё 3 комментария
Теги:
imagej

1 ответ

1

ImageJ может представлять собой подписанный 16-разрядный тип с использованием специальной функции Calibration. Метод isSigned16Bit() указывает, когда эта конкретная функция калибровки используется - это линейная калибровка m * x + b, где m = 1 и b = -32768; это можно увидеть в исходном коде ImageJ.

ImageJ предоставляет способ получения BufferedImage из ImagePlus помощью метода getImage(). Однако это всегда возвращает 8-бит BufferedImage.

Итак, следующий подход заключается в создании собственного BufferedImage с типом DataBuffer.TYPE_SHORT, который обертывает тот же самый short[] массив, который поддерживает исходный объект ImagePlus. К сожалению, из-за внутреннего представления ImageJ подписанных 16-битных данных значения будут отключены постоянным смещением 32768, например, исходное значение -444 будет сохранено в массиве ImageJ short[] как 32324. Из-за этого факт, вы должны вручную настроить все свои значения перед упаковкой в качестве BufferedImage.

Вот пример кода:

import io.scif.gui.AWTImageTools;
...

final ImagePlus imp =
    IJ.openImage("http://imagej.net/images/ct.dcm.zip");

// get pixels array reference
final short[] pix = (short[]) imp.getProcessor().getPixels();
final int w = imp.getWidth();
final int h = imp.getHeight();
final boolean signed = imp.getCalibration().isSigned16Bit();

if (signed) {
    // adjust raw pixel values
    for (int i=0; i<pix.length; i++) {
        pix[i] -= 32768;
    }
}

// convert to BufferedImage
final BufferedImage image = AWTImageTools.makeImage(pix, w, h, signed);

Для фактического преобразования short[] в BufferedImage этом коде используются утилиты утилиты SCIFIO library AWTImageTools.makeImage. SCIFIO входит в дистрибутив ImageJ от Fiji. Альтернативно, это всего лишь несколько строк кода, которые легко скопировать и вставить из рассматриваемой процедуры.

  • 0
    я делаю ту же процедуру, но не получаю оригинальное изображение. пока не получу четкое изображение (в отличие от серого, но в действительности требуется черный)
  • 0
    Проверьте достоверность значений результирующего пикселя BufferedImage , но я предполагаю, что цвета изображения просто не масштабируются так, как вы ожидаете, потому что это 16-битное изображение. Java не масштабирует изображения BufferedImage при их рисовании.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню