图像J 16位有符号缓冲图像

时间:2014-04-24 10:41:03

标签: java imagej

所以我的问题是如何从ij.ImagePlus中获取16位bufferedImage ...? 如果我想使用ShortProcessor它将我的签名图像更改为无符号,所以我没有获得原始图像...提前感谢任何人提供解决方案。

enter image description here

ImageJ如何在他们的查看器中显示16位带符号的图像...我们只获得8位bufferedImage或16位无符号bufferedImage所以我怎样才能得到16位有符号的BufferedImage ..?

1 个答案:

答案 0 :(得分:1)

ImageJ可以使用特殊的Calibration函数表示带符号的16位类型。 isSigned16Bit()方法指示何时使用特定校准函数 - 它是线性m * x + b校准,其中m = 1且b = -32768;这可以是seen in the ImageJ source code

ImageJ提供了一种通过BufferedImage方法从ImagePlus获取getImage()的方法。但是,这是always returns an 8-bit BufferedImage

所以接下来的方法是创建一个类型为BufferedImage的{​​{1}},它包含支持原始DataBuffer.TYPE_SHORT对象的相同short[]数组。不幸的是,由于ImageJ对带符号的16位数据的内部表示,值将以32768的常量偏移量关闭 - 例如,原始值-444将作为32324存储在ImageJ的ImagePlus数组中。由于这一事实,您必须手动调整所有值,然后再换行为short[]

以下是一些示例代码:

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[]的实际转换,此代码使用SCIFIO库的AWTImageTools.makeImage实用程序方法。 SCIFIO包含在Fiji distribution of ImageJ中。或者,只需几行代码即可轻松复制和粘贴相关例程。