所以我的问题是如何从ij.ImagePlus中获取16位bufferedImage ...? 如果我想使用ShortProcessor它将我的签名图像更改为无符号,所以我没有获得原始图像...提前感谢任何人提供解决方案。
ImageJ如何在他们的查看器中显示16位带符号的图像...我们只获得8位bufferedImage或16位无符号bufferedImage所以我怎样才能得到16位有符号的BufferedImage ..?
答案 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中。或者,只需几行代码即可轻松复制和粘贴相关例程。