Итак, мой вопрос заключается в том, как получить 16 бит bufferedImage из ij.ImagePlus...? Если я пытаюсь использовать ShortProcessor, он меняет подписанное изображение на unsigned, поэтому я не получаю оригинальное изображение... Спасибо заранее, может ли кто-нибудь предоставить решение.
Как ImageJ отображает 16-битное подписанное изображение в своем средстве просмотра... и мы получаем только 8 бит bufferedImage или 16-битный unsigned bufferedImage. Так как я могу получить 16-битную подпись BufferedImage..?
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. Альтернативно, это всего лишь несколько строк кода, которые легко скопировать и вставить из рассматриваемой процедуры.
BufferedImage
, но я предполагаю, что цвета изображения просто не масштабируются так, как вы ожидаете, потому что это 16-битное изображение. Java не масштабирует изображения BufferedImage
при их рисовании.
ImagePlus
? Насколько мне известно, ImageJ поддерживает только 16-битные изображения без знака . ЧтоImagePlus#getType()
?